(使用mtcars和虹膜进行再现)
我创建了一个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
都欢迎申请和提供解决方案。我也正在寻找可以告诉我如何更好地编写函数的人,我怀疑我创建的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)
如果您对解决方案感兴趣,请替换sapply
为。map
purrr
另一种方法是直接传递列值而不是名称。
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] 删除。
我来说两句