当列中的值在d​​f中相等时添加行

时间:2015-02-04 17:57:48

标签: r

对于示例数据框:

df <- structure(list(animal.1 = structure(c(1L, 1L, 2L, 2L, 2L, 4L, 
                                        4L, 3L, 1L, 1L), .Label = c("cat", "dog", "horse", "rabbit"), class = "factor"), 
                 animal.2 = structure(c(1L, 2L, 2L, 2L, 4L, 4L, 1L, 1L, 3L, 
                                        1L), .Label = c("cat", "dog", "hamster", "rabbit"), class = "factor"), 
                 number = c(5L, 3L, 2L, 5L, 1L, 4L, 6L, 7L, 1L, 11L)), .Names = c("animal.1", 
                                                                                  "animal.2","number"), class = "data.frame", row.names = c(NA, 
                                                                                                                                             -10L))

...我希望用动物制作一个新的df&#39;重复所有加在一起。例如,将第1列和第2列中具有相同动物的多行放在一起。例如,上面的数据框如下:

猫猫16

狗狗7

猫狗等等......(那些有不同动物的人会保持原样)。重要的是&#39;数字的总和&#39;在两个数据帧中都是一样的。

我的真实df是> 400K观测值,所以任何人都可以推荐的任何东西都能应对大型数据集会很棒!

提前致谢。

1 个答案:

答案 0 :(得分:2)

一种选择是使用data.table。转换&#34; data.frame&#34;到&#34; data.table&#34; (setDT(),如果&#34;动物1&#34;行等于&#34; animal.2&#34;,然后,替换&#34;数字&#34; sum的&#34;数字&#34;在按两列分组后,最后得到unique行。

library(data.table)
setDT(df)[as.character(animal.1)==as.character(animal.2), 
               number:=sum(number) ,.(animal.1, animal.2)]
unique(df)
#    animal.1 animal.2 number
#1:      cat      cat     16
#2:      cat      dog      3
#3:      dog      dog      7
#4:      dog   rabbit      1
#5:   rabbit   rabbit      4
#6:   rabbit      cat      6
#7:    horse      cat      7
#8:      cat  hamster      1

dplyr选项。该方法类似于data.table。我们将&#34; animal.1&#34;,&#34; animal.2&#34;分组,然后替换&#34;数字&#34; sum只有当&#34; animal.1&#34;等于&#34; animal.2&#34;,并获得unique

library(dplyr)
  df %>% 
     group_by(animal.1, animal.2) %>% 
     mutate(number=replace(number,as.character(animal.1)==
                                    as.character(animal.2),
     sum(number))) %>% 
     unique()