【问题标题】:R- Collapse rows and sum the values in the columnR-折叠行并对列中的值求和
【发布时间】:2013-05-22 14:14:25
【问题描述】:

我有以下数据框(df1):

ID    someText    PSM OtherValues
ABC   c   2   qwe
CCC   v   3   wer
DDD   b   56  ert
EEE   m   78  yu
FFF   sw  1   io
GGG   e   90  gv
CCC   r   34  scf
CCC   t   21  fvb
KOO   y   45  hffd
EEE   u   2   asd
LLL   i   4   dlm
ZZZ   i   8   zzas

我想折叠第一列并添加相应的 PSM 值 我想得到以下输出:

ID  Sum PSM
ABC 2
CCC 58
DDD 56
EEE 80
FFF 1
GGG 90
KOO 45
LLL 4
ZZZ 8

聚合函数似乎可行,但不知道语法。 非常感谢任何帮助!谢谢。

【问题讨论】:

    标签: r unique aggregate rows collapse


    【解决方案1】:

    在基地:

    aggregate(PSM ~ ID, data=x, FUN=sum)
    ##    ID PSM
    ## 1 ABC   2
    ## 2 CCC  58
    ## 3 DDD  56
    ## 4 EEE  80
    ## 5 FFF   1
    ## 6 GGG  90
    ## 7 KOO  45
    ## 8 LLL   4
    ## 9 ZZZ   8
    

    【讨论】:

      【解决方案2】:

      使用dplyr的例子,plyr的下一次迭代:

      df2 <- df1 %>% group_by(ID) %>%
           summarize(Sum_PSM = sum(PSM))
      

      当您输入字符%&gt;% 时,您就是在“管道”。这意味着您正在输入该管道运算符左侧的内容并在右侧执行功能。

      【讨论】:

        【解决方案3】:

        使用plyr 包非常简单:

        library(plyr)
        ddply(df1, .(ID), summarize, Sum=sum(PSM))
        

        【讨论】:

          【解决方案4】:

          如果您只想保留原始列名并一次在一列内操作,使用聚合函数似乎比 dplyr 更好。避免使用汇总函数,

          summary 函数文档中的注释

          使用现有变量名时要小心;相应的 列将立即用新数据更新,这可以 影响引用这些变量的后续操作。

          例如

          ## modified example from aggregate documentation with character variables and NAs
          testDF <- data.frame(v1 = c(1,3,5,7,8,3,5,NA,4,5,7,9),
                           v2 = c(11,33,55,77,88,33,55,NA,44,55,77,99) )
          by <- c("red", "blue", 1, 2, NA, "big", 1, 2, "red", 1, NA, 12)
          
          aggregate(x = testDF, by = list(by1), FUN = "sum")
          Group.1 v1  v2
          1       1 15 165
          2      12  9  99
          3       2 NA  NA
          4     big  3  33
          5    blue  3  33
          6     red  5  55
          

          你得到你想要的,但是当你使用 summarise 和 ddply 时,你需要指定名称。所以如果你有很多列,聚合似乎很方便。

          testDF$ID=by1
          ddply(testDF, .(ID), summarize, v1=sum(v1), v2=sum(v2) )
          ID v1  v2
          1    1 15 165
          2   12  9  99
          3    2 NA  NA
          4  big  3  33
          5 blue  3  33
          6  red  5  55
          7 <NA> 15 165
          

          要查看立即更新列的效果,您可以查看以下示例,

          ddply(testDF, .(ID), summarize, v1=max(v1,v2), v2=min(v1,v2) )
          ID v1 v2
          1    1 55 55
          2   12 99 99
          3    2 NA NA
          4  big 33 33
          5 blue 33 33
          6  red 44 11
          7 <NA> 88 77
          
          ddply(testDF, .(ID), summarize, v1=min(v1,v2), v2=min(v1,v2) )
          ID v1 v2
          1    1  5  5
          2   12  9  9
          3    2 NA NA
          4  big  3  3
          5 blue  3  3
          6  red  1  1
          7 <NA>  7  7
          

          请注意,当V1使用max时,计算v2时col已经更新,所以例如ID=1的情况下,在v2中使用min时我们不能得到数字5。

          【讨论】:

            【解决方案5】:

            使用 data.table

            setDT(df1)[,  lapply(.SD, sum) , by = ID, .SDcols = "PSM" ]
            

            【讨论】:

              猜你喜欢
              • 2022-07-21
              • 1970-01-01
              • 2020-01-20
              • 1970-01-01
              • 2020-11-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-06-25
              相关资源
              最近更新 更多