2

我有几个 data.frames 的列表。每个 data.frame 都有几列。通过使用 mean(mylist$first_dataframe$a ,我可以在这个 data.frame 中获得 a 的平均值。但是我不知道如何计算存储在我的列表中的所有 data.frames 或如何计算特定的 data.frames。

我可以使用循环,但有人告诉我, apply()它的变体更好我尝试使用通过搜索找到的几种解决方案,但不知何故它不起作用。我想我需要使用

unlist()

您能否提供一个示例来说明如何计算像我这样的数据结构的平均值。一个包含多个 data.frames 的列表,其中包含多个列。

更新:我很抱歉造成混乱。我想要所有数据框中特定列的总平均值。感谢 Thomas 提供了一个工作解决方案来计算所有数据帧中特定列的总平均值,并感谢psychometriko 提供了一个有用的解决方案来计算所有数据帧中所有列的平均值(甚至在不涉及数字数据的情况下) .

谢谢!

4

2 回答 2

4

这是你想要的?

set.seed(42)
mylist <- list(a=data.frame(foo=rnorm(10),
                            bar=rnorm(10)),
               b=data.frame(foo=rnorm(10),
                            bar=rnorm(10)),
               c=data.frame(foo=rnorm(10),
                            bar=rnorm(10)))
sapply(do.call("rbind",mylist),mean)

       foo        bar 
 0.1163340 -0.1696556 

注意:do.call("rbind",mylist)返回类似于您上面提到的unlist函数的内容,然后sapply,正如 Roland 在他的回答中所提到的,只需调用上述函数mean产生的 data.frame 的每个组件(列)上的do.call函数。

编辑:针对如何处理非数字 data.frame 组件的问题,下面的解决方案诚然不是很优雅,我确信存在更好的解决方案,但这是我能想到的第一件事:

set.seed(42)
mylist <- list(a=data.frame(rand=rnorm(10),
                            lets=sample(LETTERS,10,replace=TRUE)),
               b=data.frame(rand=rnorm(10),
                            lets=sample(LETTERS,10,replace=TRUE)),
               c=data.frame(rand=rnorm(10),
                            lets=sample(LETTERS,10,replace=TRUE)))
sapply(do.call("rbind",mylist),function(x) {
  if (is.numeric(x)) mean(x)
})

$rand
[1] -0.02470602

$lets
NULL

这基本上只是创建了一个自定义函数,该函数首先测试每个分量是否为数字,如果是,则返回平均值。如果不是,它会跳过它。

于 2013-06-17T11:49:08.307 回答
2

整个do.call('rbind', List)事情可能非常缓慢并且容易发生意外。如果只有一列需要平均值,最好的方法是:

mean(sapply(mylist, function(X) X$rand))

do.call方法大约快 10 倍。

于 2013-06-19T20:43:49.337 回答