【问题标题】:How can I return a list of summary statistics?如何返回汇总统计信息列表?
【发布时间】:2014-09-24 15:33:53
【问题描述】:

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

【问题讨论】:

  • 目前的列表怎么不能满足你的需求?您打算如何“循环”思考此列表以及您打算如何使用这些值?我不清楚问题是什么。如果使用实际可运行代码和示例数据创建reproducible example 以重新创建您的确切问题会有所帮助。

标签: r dataframe summary


【解决方案1】:

当我像这样工作时,我有一个功能。 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)))

【讨论】:

  • 您应该将funs 设为具有默认值的参数。
【解决方案2】:

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

【讨论】:

  • 谢谢!我之前有过这个:x
  • 另外,只是一个简单的问题,以便我能更好地理解它,但是“function(x)”的作用是什么?
  • @Mole function(x)(即list...)引入的函数应用于所有列。这里,x 代表一列。
猜你喜欢
  • 1970-01-01
  • 2020-12-03
  • 2019-08-18
  • 2019-03-19
  • 2012-04-08
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多