【问题标题】:Get the mean across list of dataframes by rows按行获取数据框列表的平均值
【发布时间】:2020-01-30 07:26:43
【问题描述】:

我有一个数据框列表,我想计算每个第一行、所有第二行等的平均值。

我认为这可以通过创建一些公共因子作为索引,使用rbind 将数据帧放在一起,然后使用aggregate(value ~ row.index, mean, large.df) 计算平均值来实现。不过,我想还有更直接的方法吗?

这是我的例子:

df1 = data.frame(val = c(4,1,0))
df2 = data.frame(val = c(5,2,1))
df3 = data.frame(val = c(6,3,2))

myLs=list(df1, df2, df3)

[[1]]
  val
1   4
2   1
3   0

[[2]]
  val
1   5
2   2
3   1

[[3]]
  val
1   6
2   3
3   2

以及我预期的数据帧输出,因为 rowise 的意思是:

df.means
  mean
1   5
2   2
3   1

我的第一步,还没有按预期工作:

# Calculate the mean of list by rows
lapply(myLs, function(x) mean(x[1,]))

【问题讨论】:

    标签: r list dataframe aggregate lapply


    【解决方案1】:

    一种简单的方法是cbind 列表并使用rowMeans 计算每一行的平均值

    rowMeans(do.call(cbind, myLs))
    #[1] 5 2 1
    

    我们还可以使用dplyr 中的bind_cols 来组合所有数据帧。

    rowMeans(dplyr::bind_cols(myLs))
    

    【讨论】:

      【解决方案2】:

      这是另一个使用unlist + data.frame + rowMeans 的基本 R 解决方案,即,

      rowMeans(data.frame(unlist(myLs,recursive = F)))
      # [1] 5 2 1
      

      【讨论】:

        【解决方案3】:

        使用双循环:

        sapply(1:3, function(i) mean(sapply(myLs, function(j) j[i, ] )))
        # [1] 5 2 1
        

        【讨论】:

          【解决方案4】:

          另一个base R 可能是:

          Reduce("+", myLs)/length(myLs)
          
            val
          1   5
          2   2
          3   1
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-10-25
            • 1970-01-01
            • 2018-01-03
            • 2021-02-08
            • 2019-12-06
            • 2023-02-09
            • 2017-10-12
            相关资源
            最近更新 更多