【发布时间】:2020-11-11 05:41:25
【问题描述】:
(使用 mtcars 和 iris 进行再现)
我创建了一个 R 函数 get_col_info 来查找数据摘要,如下所示:
-
如果列是
numeric/integer/double,则得到最小值、最大值、平均值 -
如果列是
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
欢迎使用 apply 和 purrr 解决方案。我也在找人告诉我如何才能更好地编写函数,我怀疑我创建的 c_name 不是捕获列名的理想方法。
【问题讨论】:
-
用你写的函数,你可以这样做:
sapply(c("Petal.Length","Petal.Width"), get_col_info, data=iris)
标签: r dplyr tidyverse apply purrr