基于 R 中具有相似向量的两列对一列项求和或聚合



我需要在两列中聚合具有相似项目的行,请。请问是否有"或"功能来执行此操作?我在下面发布了一个示例数据集:

A1 <- data.frame(Animal1= c("A", "A","B","B","D") ,Animal2=c("B","D","D","A","B"),Frequency=c(2,3,1,4,5))
> A1
Animal1 Animal2 Frequency
1       A       B         2
2       A       D         3
3       B       D         1
4       B       A         4
5       D       B         5

如何聚合,以便我只得到一个值,组合第 3 行和第 5 行的频率,其中动物 1 是 B,动物 2 是第 3 行的 D,动物 1 是 D,动物 2 是第 5 行的 B,频率为 6?

这是一个可能的解决方案。我可能过于复杂了,但它应该给你想要的结果。我做的第一件事是使字符串不是数据帧中的因子。

A1 <- data.frame(Animal1= c("A", "A","B","B","D"), Animal2=c("B","D","D","A","B"), 
Frequency=c(2,3,1,4,5), stringsAsFactors = FALSE) 
A1 %>% 
mutate(combined = map2_chr(Animal1, Animal2, ~paste0(sort(c(.x, .y)), collapse = ""))) %>%  
group_by(combined) %>% 
summarise(total = sum(Frequency))

输出

# A tibble: 3 x 2
combined total
<chr>    <dbl>
1 AB           6
2 AD           3
3 BD           6

我不确定我是否理解您的问题,但这是您要找的吗?

library(dplyr)
df %>% as_tibble %>% 
filter((Animal1 == "B" & Animal2 == "D") | (Animal1 == "D" & Animal2 == "B")) %>% 
summarise(sum_freq = sum(Frequency))

谢谢,伙计们。除了@StephenK的回答之外,我还添加了另一个步骤来拆分新的"组合"列。

A1 <- data.frame(Animal1= c("A", "A","B","B","D"), Animal2=c("B","D","D","A","B"), 
Frequency=c(2,3,1,4,5), stringsAsFactors = FALSE) 
A2<- as.data.frame(A1 %>% mutate(combined = map2_chr(Animal1, Animal2, ~paste0(sort(c(.x, .y)), collapse = ""))) %>%  
group_by(combined) %>% summarise(total = sum(Frequency)))
#create new columns for each letter
A2$Animal1 <- substr(A2$combined, start = 1, stop = 1)
A2$Animal2 <- substr(A2$combined, start = 2, stop = 2)
A2
combined total Animal1 Animal2
1       AB     6       A       B
2       AD     3       A       D
3       BD     6       B       D
##Select only columns needed and reorder
A3 <- A2[,c("Animal1","Animal2", "total")]
A3
Animal1 Animal2 total
1       A       B     6
2       A       D     3
3       B       D     6

最新更新