【问题标题】:r get mean of n columns by rowr 逐行获取 n 列的平均值
【发布时间】:2015-10-19 10:00:15
【问题描述】:

我有一个简单的data.frame

> df <- data.frame(a=c(3,5,7), b=c(5,3,7), c=c(5,6,4))
> df
  a b c
1 3 5 5
2 5 3 6
3 7 7 4

是否有一种简单有效的方法来获取具有相同行数但平均值为例如列 a 和 b 的新 data.frame?像这样:

  mean.of.a.and.b c
1               4 5
2               4 6
3               7 4

【问题讨论】:

    标签: r dataframe mean


    【解决方案1】:

    仅在前两列使用rowMeans()。然后cbind() 到第三列。

    cbind(mean.of.a.and.b = rowMeans(df[-3]), df[3])
    #   mean.of.a.and.b c
    # 1               4 5
    # 2               4 6
    # 3               7 4
    

    注意:如果您的原始数据中有任何 NA 值,您可能需要在 rowMeans() 中使用 na.rm = TRUE。请参阅?rowMeans 了解更多信息。

    【讨论】:

      【解决方案2】:

      使用dplyr 包的另一个选项:

      library("dplyr")
      
      df %>%
        rowwise()%>%
        mutate(mean.of.a.and.b = mean(c(a, b))) %>%
        ## Then if you want to remove a and b:
        select(-a, -b)
      

      【讨论】:

        【解决方案3】:

        我认为最好的选择是使用 Richard Scriven 发布的rowMeans()。 rowMeans 和 rowSums 等效于在 FUN = mean 或 FUN = sum 时使用 apply,但要快得多。我发布带有 apply 的版本仅供参考,以防我们想传递另一个函数。

        data.frame(mean.of.a.and.b = apply(df[-3], 1, mean), c = df[3])
        

        输出:

          mean.of.a.and.b c
        1               4 5
        2               4 6
        3               7 4
        

        使用带有sqldf的SQL非常冗长

        library(sqldf
        sqldf("SELECT (sum(a)+sum(b))/(count(a)+count(b)) as mean, c 
              FROM df group by c")
        

        输出:

          mean c
        1    7 4
        2    4 5
        3    4 6
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-03-14
          • 2015-02-04
          • 1970-01-01
          • 1970-01-01
          • 2014-10-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多