【问题标题】:Sum of rows based on column value基于列值的行总和
【发布时间】:2013-02-24 01:36:30
【问题描述】:

我想对一列中具有相同值的行求和:

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

对于一列(X2),可以对数据进行聚合,得到所有 X1 值相同的行的总和:

> ddply(df, .(X1), summarise, X2=sum(X2))
  X1 X2
1  a  4
2  b  5
3  c  8

如何对 X3 和除 X1 之外的任意数量的其他列执行相同操作?

这是我想要的结果:

  X1 X2 X3
1  a  4  7
2  b  5  3
3  c  8  7

【问题讨论】:

    标签: r plyr


    【解决方案1】:
    ddply(df, "X1", numcolwise(sum))
    

    有关详细信息和示例,请参阅?numcolwise

    【讨论】:

      【解决方案2】:

      aggregate 可以通过公式界面轻松做到这一点:

      aggregate(. ~ X1, data=df, FUN=sum)
      ##   X1 X2 X3
      ## 1  a  4  7
      ## 2  b  5  3
      ## 3  c  8  7
      

      等价:

      aggregate(cbind(X2, X3) ~ X1, data=df, FUN=sum)
      

      【讨论】:

        【解决方案3】:

        aggregate 是处理这类事情的绝佳函数:

        aggregate(df[,-1],df["X1"],sum)
        
          X1 X2 X3
        1  a  4  7
        2  b  5  3
        3  c  8  7
        

        以及来自 plyr 的 numcolwise 方法的基本 R 版本:

        aggregate(df[,sapply(df,is.numeric)],df["X1"],sum)
        

        【讨论】:

          【解决方案4】:

          data.table 的内存效率和编码优雅解决方案

          library(data.table)
          DT <- data.table(df)
          
          
          DT[, lapply(.SD, sum), by = X1]
          

          .SD 是由X1 的值定义的每个组的data.table 的子集。 data.table 包有 3 个有用的小插曲。

          【讨论】:

            猜你喜欢
            • 2017-02-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-08-02
            • 2021-11-07
            • 2021-11-19
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多