在R中的自定义函数上使用sapply

韦巴·辛格

(使用mtcars和虹膜进行再现)

我创建了一个R函数get_col_info来查找数据摘要,如下所示:

  1. 如果列是numeric/integer/double最小,最大,平均值

  2. 如果列是,character/factor则获取唯一值和唯一值的计数

     get_col_info <- function(data,col_name) {  
    
      c_name <- c(col_name)
      s <- data[,c_name]
      type <- typeof(s)
    
      if(type %in% c("numeric","double","integer")){
       min <- min(s)
       max <- max(s)
       mean <- mean(s)
       aa <- list(min=min, max=max,mean=mean)
       return(aa)
      }
    
     if(type %in% c("character","factor")){
      uni <- unique(s)
      len <- length(uni)
      aa <- list(n_values=len,unique_values=c(uni))
      return(aa)}
     }
    
    get_col_info(mtcars, "mpg")
    get_col_info(iris, "Petal.Width")
    get_col_info(iris, "Species")
    

前两个运行完美,第三个运行出错,不确定为什么吗?

但是,主要查询现在是我想一次为所有列名运行此函数,类似sapply(iris,mean)但我不确定如何执行此操作,因为该函数接受数据框和列名。我尝试这样做,但这给了我一个错误

sapply(iris,get_col_info(iris,names(iris)))

Error in match.fun(FUN) : 
  'get_col_info(iris, names(iris))' is not a function, character or symbol

都欢迎申请和提供解决方案。我也正在寻找可以告诉我如何更好地编写函数的人,我怀疑我创建的c_name不是捕获列名的理想方法。

罗纳克·沙

您应该使用class检查类型,而不是typeof

get_col_info <- function(data,col_name) {    
  s <- data[,col_name]
  type <- class(s)
  if(type %in% c("numeric","double","integer")){
    min <- min(s)
    max <- max(s)
    mean <- mean(s)
    aa <- list(min=min, max=max,mean=mean)
    return(aa)
  }
  else if(type %in% c("character","factor")){
    uni <- as.character(unique(s))
    len <- length(uni)
    aa <- list(n_values=len,unique_values=uni)
    return(aa)
  }
}

检查输出:

get_col_info(mtcars, "mpg")
#$min
#[1] 10.4

#$max
#[1] 33.9

#$mean
#[1] 20.09062

get_col_info(iris, "Species")
#$n_values
#[1] 3

#$unique_values
#[1] "setosa"     "versicolor" "virginica" 

要针对多个列运行此命令,可以使用:

sapply(names(iris), get_col_info, data = iris)

如果您对解决方案感兴趣,请替换sapplymappurrr


另一种方法是直接传递列值而不是名称。

get_col_info <- function(s) {    
  if(is.numeric(s)) {
    min <- min(s)
    max <- max(s)
    mean <- mean(s)
    aa <- list(min=min, max=max,mean=mean)
    return(aa)
  }
  else {
    uni <- as.character(unique(s))
    len <- length(uni)
    aa <- list(n_values=len,unique_values=uni)
    return(aa)
  }
}

sapply(iris, get_col_info)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何避免在R中的用户定义函数上使用sapply()

r-如何在使用dplyr的自定义函数上使用迭代

在R中自动创建和使用自定义函数

在自定义R包中的函数中使用mclapply

R 中的自定义函数

自定义 R 中的排序函数

R:apply()中的自定义函数

如何在函数上应用自定义信息以在Visual Studio中调用时显示

如何在具有TensorFlow概率的自定义函数上使用MCMC采样

Laravel paginate()在自定义静态函数上

函数未在 R 中的自定义函数中执行

为什么以及何时使用Python中的文字比较运算符(如“ ==”)在内置函数上使用自定义类型的魔术方法?

在 R Shiny 中定义自定义文本函数

在使用自定义函数的自定义函数中调用公式

R 相关 - 如何使用 lapply 和 list 在 r 中循环自定义函数?

如何使用R中的自定义函数聚合data.frame中的多个列?

自定义函数替换R中向量中的值

使用字符串向量在 R 中循环自定义 ifelse 函数

使用 R 函数在全局环境中自定义输出名称

如何在R中的data.table中使用自定义函数

R:使用自定义概率函数从向量中绘制

不能在 r 中的自定义函数中使用非标准评估

如何在Tableau中的Script_Real()中使用自定义的R函数?

R Keras中的自定义损失函数

在R中编写自定义分类器并预测函数

如何自定义属于包的R函数中的图?

带有 dplyr 的 R 中的自定义函数

在R中创建自定义dplyr数据转换函数

r:在自定义函数中嵌套 for 循环