对于示例数据框:
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观测值,所以任何人都可以推荐的任何东西都能应对大型数据集会很棒!
提前致谢。
答案 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()