我有几个 data.frames 的列表。每个 data.frame 都有几列。
通过使用
平均(mylist$first_dataframe$a
我可以在这个 data.frame 中得到 a 的平均值。
但是我不知道如何计算列表中存储的所有 data.frames 或如何计算特定的 data.frames。
我可以使用循环,但有人告诉我
apply()
及其变体更好
我尝试使用通过搜索找到的几种解决方案,但不知何故它不起作用。
我想我需要使用
unlist()
您能否举例说明如何计算,例如像我这样的数据结构的意思。 包含多个数据框的列表,其中包含多个列。
更新: 对于造成的困惑,我深表歉意。我想要所有数据框中特定列的总均值。 感谢 Thomas 提供了一个工作解决方案来计算所有数据框中特定列的总均值,并感谢 psychometriko 提供了一个有用的解决方案来计算所有数据框中所有列的均值(甚至在不涉及数字数据的情况下) .
谢谢!
最佳答案
这是您要找的吗?
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 在他的回答中所提到的,只是在由上述 do.call
产生的 data.frame 的每个组件(列)上调用函数 mean
> 功能。
编辑:针对如何处理非数字 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
这基本上只是创建了一个自定义函数,它首先测试每个分量是否为数字,如果是,则返回平均值。如果不是,它会跳过它。
关于r - 计算例如具有多列 data.frames 的列表中的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17146523/