我正在编写一个函数,其输出是未知列数据框的汇总统计信息列表。例如,如果我的数据框有3列,我的列表输出必须如此:
col1
col1mean
(mean of column 1)
col1
col1median
(median of column 1)
col2
col2$mean
(mean of column 2)
col2
col2$median
(median of column2)
col3
col3mean
(mean of column 3)
col3
col3median
(median of column 3)
我的问题是,如何返回我的列表,以便循环显示n列数的均值,中位数和标准差?
答案 0 :(得分:2)
我有这样的功能。 easyStats()
计算向量的均值,中位数,标准差,最大值和最小值。您可以使用lapply()
轻松使用它,并且可能会产生比您显示的更理想的结果。以下是mtcars
前三列的示例。如果有NA值,您还可以添加na.rm = TRUE
。
lapply(mtcars[1:3], easyStats)
# $mpg
# mean median sd max min
# 20.091 19.200 6.027 33.900 10.400
#
# $cyl
# mean median sd max min
# 6.188 6.000 1.786 8.000 4.000
#
# $disp
# mean median sd max min
# 230.722 196.300 123.939 472.000 71.100
easyStats
定义为
easyStats <- function (x, digits = 3L, ...) {
stopifnot(as.logical(length(x)), is.vector(x), is.numeric(x))
funs <- c("mean", "median", "sd", "max", "min")
mp <- mapply(function(f, ...) match.fun(f)(x, ...), funs, ...)
round(mp, digits = digits)
}
但是对于您的特定问题,您可以将功能调整为
easyStats2 <- function(x, funs = c("mean", "median", "sd"), digits = 3L, ...) {
mp <- mapply(function(f, ...) match.fun(f)(x, ...), funs, ...)
round(mp, digits = digits)
}
然后致电
lapply(mtcars[1:3], function(x) as.list(easyStats2(x)))
答案 1 :(得分:1)
使用lapply
的一种方法:
# example data
set.seed(123)
dat <- data.frame(col1 = rnorm(10), col2 = rnorm(10), col3 = rnorm(10))
lapply(dat, function(x) list(mean = mean(x), median = median(x), sd = sd(x)))
结果:
$col1
$col1$mean
[1] 0.07462564
$col1$median
[1] -0.07983455
$col1$sd
[1] 0.9537841
$col2
$col2$mean
[1] 0.208622
$col2$median
[1] 0.3802926
$col2$sd
[1] 1.038073
$col3
$col3$mean
[1] -0.4245589
$col3$median
[1] -0.6769652
$col3$sd
[1] 0.9308092