【问题标题】:Calculate e.g. a mean in a list with multi-column data.frames计算例如具有多列 data.frames 的列表中的平均值
【发布时间】:2013-06-17 11:34:19
【问题描述】:

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

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

unlist()

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

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

谢谢!

【问题讨论】:

  • 组成列表组件的数据框是否具有相同的结构(即,每列中具有相同名称和类的相同列数——行数可以不同)?跨度>
  • @psychometriko 它们的结构完全相同
  • @Thomas 最后一个。所以我有一个清单。该列表包含许多具有相同结构的数据框。假设有 dataframe1 到 dataframe5,每个都有列“a”、“b”和“c”。现在我想要所有数据帧组合的“a”的总平均值。
  • @Nikita:如果列名也是要从用户那里获取的参数,你能帮我弄清楚如何做同样的事情吗?

标签: r list dataframe


【解决方案1】:

这是你要找的吗?

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(列)由上述do.call 函数产生的data.frame。

编辑:针对如何处理非数字 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

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

【讨论】:

  • 是的!谢谢你。这是我需要的,你的例子有效。但是如何判断只计算“foo”或“bar”。在对整个列表使用此代码时,我会收到很多警告(不是数字)和奇怪的结果。
  • 这也有效,但这并不是所有数据帧的总平均值。它列出了每个数据帧及其“foo”/“a”的平均值。
  • 如果你想要一个特定的变量,或者只是mean(do.call("rbind",mylist)$foo)
  • @Nikita 你能澄清一下吗?当我测试我的代码时,我只看到每个列表组件的平均值。
  • 是的!最后一个做到了。非常感谢!所以基本上它需要 mylist 中的所有“foo”行并计算平均值。 do.call 有魔力:)
【解决方案2】:

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

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

它比 do.call 方法快大约 10 倍。

【讨论】:

  • 如果列名也是要从用户那里获取的参数怎么办?
猜你喜欢
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 2015-09-05
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
相关资源
最近更新 更多