如何通过两列中的值匹配对并合并数据框?

时间:2018-05-06 18:38:35

标签: r dataframe merge match

我们说我有一个数据框

x    y    val
A    B    5
A    C    3
B    A    7
B    C    9
C    A    1

正如您所看到的,xy匹配了两对:

配对1:A B 5B A 7

配对2:A C 3C A 1

我想将它们合并到A B 12A C 4并离开B C 9,因为它没有一对(C B)。

最终的数据框应如下所示:

x    y    val
A    B    12
A    C    4
B    C    9

我如何在R?

中实现这一目标

3 个答案:

答案 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)

首先确保xy给予DF_c字符,然后对其进行排序DF_s。最后执行聚合。没有使用包裹。如果xy已经是角色,则不需要第一行。

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 CA C BB 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)