Объединить столбцы, выровнять по значению, заполнить NA, если значения не совпадают - PullRequest
2 голосов
/ 13 мая 2019

Это на удивление сложно.Я пробовал варианты full_join и bind_cols и merge, но не могу заставить это работать.

У меня есть:

> (t1 <- data.frame(x = letters[10:3], stringsAsFactors = FALSE))
  x
1 j
2 i
3 h
4 g
5 f
6 e
7 d
8 c

и:

> (t2 <- data.frame(y = letters[1:4], stringsAsFactors = FALSE))
  y
1 a
2 b
3 c
4 d

Я думаю, что я ищу какой-то тип full_join, который сохраняет оба столбца и выполняет операции над множествами, потому что я хочу вернуть это:

> data.frame(
+   x = c(letters[10:3], NA, NA),
+   y = c(NA, NA, NA, NA, NA, NA, letters[4:1])
+ )
      x    y
1     j <NA>
2     i <NA>
3     h <NA>
4     g <NA>
5     f <NA>
6     e <NA>
7     d    d
8     c    c
9  <NA>    b
10 <NA>    a

Так что это похоже наfull_join, но сохраняет оба столбца и заполняет NA, если есть различия.Например, это просто дает мне один столбец:

> full_join(t1, t2, by = c("x" = "y"))
   x
1  j
2  i
3  h
4  g
5  f
6  e
7  d
8  c
9  a
10 b

Ответы [ 2 ]

3 голосов
/ 13 мая 2019

Немного хакер, но это работает:

full_join(
  left_join(t1, t2 %>% mutate(x = y)),
  left_join(t2, t1 %>% mutate(y = x))
)

      x    y
1     j <NA>
2     i <NA>
3     h <NA>
4     g <NA>
5     f <NA>
6     e <NA>
7     d    d
8     c    c
9  <NA>    a
10 <NA>    b
2 голосов
/ 13 мая 2019

Вы также можете найти union и match

inds <- union(t1$x, t2$y)
data.frame(x = t1$x[match(inds, t1$x)], y = t2$y[match(inds, t2$y)])

#      x    y
#1     j <NA>
#2     i <NA>
#3     h <NA>
#4     g <NA>
#5     f <NA>
#6     e <NA>
#7     d    d
#8     c    c
#9  <NA>    a
#10 <NA>    b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...