2014-09-24 196 views
0

我正在写一个函数,其输出是未知列数据帧的汇总统计列表。例如,如果我的数据帧有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列?

+3

如何在当前目录不能满足您的需求?你打算如何“循环”思考这份清单,以及你打算如何使用这些价值?我不清楚问题是什么。如果使用实际的可运行代码和示例数据来创建一个[可重现的示例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)以重新创建您的确切的问题。 – MrFlick 2014-09-24 15:37:44

回答

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 
+0

谢谢!我刚在此之前: X < - sapply(X,平均值) ý< - sapply(X,中位数) ž< - sapply(X,SD) 列表(x [1],Y [1] ,z [1]) 但不知道如何推广任何数量的列。 – Mole 2014-09-24 16:26:25

+0

此外,只是一个简单的问题,所以我可以更好地理解它,但“function(x)”服务的目的是什么? – Mole 2014-09-24 16:30:08

+0

@Mole函数(x)引入的函数(即list ...)应用于所有列。这里'x'代表一列。 – 2014-09-24 16:50:27

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))) 
+0

你应该使'funs'成为一个默认值的参数。 – Roland 2014-09-24 15:42:05