如何返回摘要统计列表?

时间:2014-09-24 15:33:54

标签: r dataframe summary

我正在编写一个函数,其输出是未知列数据框的汇总统计信息列表。例如,如果我的数据框有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列数的均值,中位数和标准差?

2 个答案:

答案 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