R: Объединить два фрейма данных на основе значения в столбце и вернуть все значения обоих фреймов данных. - PullRequest
2 голосов
/ 16 марта 2020

Допустим, у меня есть следующие dfs

df1:
a b c d
1 2 3 4
4 3 3 4
9 7 3 4

df2:
a b c d
1 2 3 4
2 2 3 4
3 2 3 4

Теперь я хочу объединить оба условных dfs столбца "a", чтобы получить следующий df

a b c d
1 2 3 4
4 3 3 4
9 7 3 4
2 2 3 4
3 2 3 4

в моем наборе данных я попытался использовать

merge <- merge(x = df1, y = df2, by = "a", all = TRUE)

Однако, хотя df1 имеет 50 000 записей, а df2 имеет 100 000 записей, и в столбце есть однозначно совпадающие значения, объединенный df содержит более миллиона записей. Я не понимаю этого. Как я понимаю, там должно быть макс. 150 000 записей в объединенном df, и это тот случай, когда значения в столбце a не равны между двумя df.

Ответы [ 4 ]

3 голосов
/ 16 марта 2020

Я думаю, что вы хотите сделать не merge, а rbind два кадра данных и удалить строки duplicated:

ДАННЫЕ :

df1 <- data.frame(a = c(1,4,9),
                  b = c(2,3,7),
                  c = c(3,3,3),
                  d = c(4,4,4))
df2 <- data.frame(a = c(1,2,3),
                  b = c(2,2,2),
                  c = c(3,3,3),
                  d = c(4,4,4))

РЕШЕНИЕ :

Связывание строк df1 и df2:

df3 <- rbind(df1, df2)

Удаление дублирующихся строк:

df3 <- df3[!duplicated(df3), ]

РЕЗУЛЬТАТ :

df3
  a b c d
1 1 2 3 4
2 4 3 3 4
3 9 7 3 4
5 2 2 3 4
6 3 2 3 4
1 голос
/ 16 марта 2020

С tidyverse мы можем сделать bind_rows и distinct

library(dplyr)
bind_rows(df1, df2) %>%
     distinct

data

df1 <- structure(list(a = c(1, 4, 9), b = c(2, 3, 7), c = c(3, 3, 3), 
    d = c(4, 4, 4)), class = "data.frame", row.names = c(NA, 
-3L))

df2 <- structure(list(a = c(1, 2, 3), b = c(2, 2, 2), c = c(3, 3, 3), 
    d = c(4, 4, 4)), class = "data.frame", row.names = c(NA, 
-3L))
0 голосов
/ 16 марта 2020

вот еще одно базовое решение R, использующее rbind + %in%

dfout <- rbind(df1,subset(df2,!a %in% df1$a))

, такое что

> rbind(df1,subset(df2,!a %in% df1$a))
   a b c d
1  1 2 3 4
2  4 3 3 4
3  9 7 3 4
21 2 2 3 4
31 3 2 3 4
0 голосов
/ 16 марта 2020

можно так

dplyr::union(df1, df2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...