【问题标题】:R: Combine rows in same data.frame [duplicate]R:合并同一data.frame中的行[重复]
【发布时间】:2013-12-04 10:48:30
【问题描述】:

我有一个简单的 R 问题,但我找不到答案。 我有一个这样的数据框:

A    1    0    0    0    0    0
B    0    1    0    0    0    0
B    0    0    1    0    0    1
B    0    0    0    0    1    0
C    1    0    0    0    0    0
C    0    0    0    1    1    0

我希望它是这样的:

A    1    0    0    0    0    0
B    0    1    1    0    1    1
C    1    0    0    1    1    0

非常感谢!

问候丽桑

【问题讨论】:

    标签: r matrix row


    【解决方案1】:
    dat <- structure(list(V1 = structure(c(1L, 2L, 2L, 2L, 3L, 3L), .Label = c("A", 
    "B", "C"), class = "factor"), V2 = c(1L, 0L, 0L, 0L, 1L, 0L), 
        V3 = c(0L, 1L, 0L, 0L, 0L, 0L), V4 = c(0L, 0L, 1L, 0L, 0L, 
        0L), V5 = c(0L, 0L, 0L, 0L, 0L, 1L), V6 = c(0L, 0L, 0L, 1L, 
        0L, 1L), V7 = c(0L, 0L, 1L, 0L, 0L, 0L)), .Names = c("V1", 
    "V2", "V3", "V4", "V5", "V6", "V7"), class = "data.frame", row.names = c(NA, 
    -6L))
    

    你可以...

    aggregate(.~ V1 , data =dat, sum)
    

    library(plyr)
    ddply(dat, .(V1), function(x) colSums(x[,2:7])  )
    

    如果您正在使用有重复项的data.frame,但您只想注意是否存在1,那么在这些函数之后,您可能想要执行dat[!(dat %in% c(1,0)] &lt;- 1 之类的操作。

    【讨论】:

    • +1 比我的好多了。
    【解决方案2】:

    未提及的一种可能性是聚合函数。我认为这是相当“可读”的。

    aggregate(cbind(data$X1, data$X2, data$X3, data$X4), 
    by = list(category = data$group), FUN = sum)
    

    【讨论】:

      【解决方案3】:

      这是使用tapply 的一种可能性:

      cbind(unique(dat[1]), do.call(rbind, tapply(dat[-1], dat[[1]], colSums)))
      
      #   V1 V2 V3 V4 V5 V6 V7
      # 1  A  1  0  0  0  0  0
      # 2  B  0  1  1  0  1  1
      # 5  C  1  0  0  1  1  0
      

      其中dat 是您的数据框的名称。

      【讨论】:

      • 感谢 Sven,这个答案对我有用! :)
      猜你喜欢
      • 1970-01-01
      • 2016-05-03
      • 2021-02-27
      • 1970-01-01
      • 2016-05-18
      • 1970-01-01
      • 2016-01-22
      • 2016-02-11
      • 1970-01-01
      相关资源
      最近更新 更多