【问题标题】:Average Cells of Two or More DataFrames两个或多个 DataFrame 的平均单元格
【发布时间】:2017-04-09 16:56:23
【问题描述】:

所以我目前有 3 个数据帧,我需要平均每个单元格,我不知道如何做到这一点......基本上,我需要获得 df1 的第 1 列中第一个观察值的平均值, df2, df3, 等等。

这是一个可重现的样本数据。

set.seed(789)
df1 <-   data.frame(
a = runif(100, 0, 100),
b = runif(100, 0, 100),
c = runif(100, 0, 100),
d = runif(100, 0, 100))

df2 <-   data.frame(
a = runif(100, 0, 100),
b = runif(100, 0, 100),
c = runif(100, 0, 100),
d = runif(100, 0, 100))

df3 <-   data.frame(
a = runif(100, 0, 100),
b = runif(100, 0, 100),
c = runif(100, 0, 100),
d = runif(100, 0, 100))

我需要创建尺寸为 100 x 4 的第四个数据框,这是对前三个数据框的每个单元格进行平均的结果。任何想法都非常感谢!

【问题讨论】:

  • (df1+df2+df3)/3
  • 它需要在开头声明set.seed 才能重现;;否则,每个复制和粘贴它的人都会为 df1、df2 和 df3 设置不同的值。

标签: r


【解决方案1】:

我们可以用Reduce+ 来做到这一点,然后除以list 中的数据集数量。这具有在list 中保留“n”个数据集的灵活性

dfAvg <- Reduce(`+`, mget(paste0("df", 1:3)))/3

或者另一种选择是转换为array,然后使用apply,它还可以选择删除缺失值(na.rm=TRUE

apply(array(unlist(mget(paste0("df", 1:3))), c(dim(df1), 3)), 2, rowMeans, na.rm = TRUE) 

正如@user20650 提到的,rowMeans 可以直接在array 上应用dim

rowMeans(array(unlist(mget(paste0("df", 1:3))), c(dim(df1), 3)), dims=2) 

【讨论】:

  • L = mget(ls(pattern = "df\\d+")); dfAvg = Reduce("+", L)/length(L)
  • Reduce 命令效果很好。我有一个问题......是否有可能让 Reduce 忽略 df 中的某些行?我刚刚意识到我原来的 DF 有两列是 ID 变量,它们是因子,在计算平均值时需要忽略。感谢您的帮助!
  • @rowbust 在这种情况下,您可以对数据集进行子集化并将其放在list 中,例如,如果 ID 变量是第一列和第二列并且想要删除它 lst &lt;- list(df1[-(1:2)], df2[-(1:2)], df3[-(1:2)]); dfAvg &lt;- Reduce("+", lst)/3 假设ID 变量在所有数据集中都相同。这也可以自动化(取决于您的需要)
猜你喜欢
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
  • 2015-06-08
  • 2021-01-01
相关资源
最近更新 更多