Как сопоставить пары и объединить фрейм данных по значениям в двух столбцах? - PullRequest
0 голосов
/ 06 мая 2018

Допустим, у меня есть датафрейм

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?

Ответы [ 3 ]

0 голосов
/ 06 мая 2018

Сначала убедитесь, что 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
0 голосов
/ 07 мая 2018

Можно сгруппировать по 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)
0 голосов
/ 06 мая 2018

Вот одно решение с 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 и y, как упоминает Мелисса Кей.

...