我们说我有一个数据框
x y val
A B 5
A C 3
B A 7
B C 9
C A 1
正如您所看到的,x
和y
匹配了两对:
配对1:A B 5
和B A 7
配对2:A C 3
和C A 1
我想将它们合并到A B 12
和A C 4
并离开B C 9
,因为它没有一对(C B
)。
最终的数据框应如下所示:
x y val
A B 12
A C 4
B C 9
我如何在R?
中实现这一目标答案 0 :(得分:3)
这是dplyr
的一个解决方案:
library(dplyr)
df %>%
mutate(var = paste(pmin(x, y), pmax(x, y))) %>%
group_by(var) %>%
summarise(val = sum(val))
# A tibble: 3 x 2 var val <chr> <int> 1 A B 12 2 A C 4 3 B C 9
如果您希望将separate(var, c("x", "y"))
和x
列作为Melissa Key提及,请将y
添加到链的末尾。
答案 1 :(得分:2)
首先确保x
和y
给予DF_c
字符,然后对其进行排序DF_s
。最后执行聚合。没有使用包裹。如果x
和y
已经是角色,则不需要第一行。
DF_c <- transform(DF, x = as.character(x), y = as.character(y))
DF_s <- transform(DF_c, x = pmin(x, y), y = pmax(x, y))
aggregate(val ~ x + y, DF_s, sum)
,并提供:
x y val
1 A B 12
2 A C 4
3 B C 9
答案 2 :(得分:0)
可以按row_number()
分组到sort
,然后按排序顺序组合列,以创建独立于订单的pair
。
注意:以下解决方案可以发展为适用于超过2列的配对。例如,将A B C
,A C B
或B C A
作为同一组创建。
library(dplyr)
library(tidyr)
df %>%
group_by(row_number()) %>%
mutate(xy = paste0(sort(c(x,y)),collapse=",")) %>%
group_by(xy) %>%
summarise(val = sum(val)) %>%
separate(xy, c("x","y"))
## A tibble: 3 x 3
# x y val
#* <chr> <chr> <int>
#1 A B 12
#2 A C 4
#3 B C 9
数据:强>
df <- read.table(text =
"x y val
A B 5
A C 3
B A 7
B C 9
C A 1",
header = TRUE, stringsAsFactors = FALSE)