Объединять кадры данных на основе столбцов и совпадений rbind - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть два кадра данных:

df <- data.frame(x=c("a","c"), y=c("111","222"))

df1 <- data.frame(x=c("a","b","b","c"), y=c("111","222","111","222"),z=c('xxx','yyy','ddd','ttt'))

Я хочу объединить эти два кадра данных на основе столбца x таким образом, чтобы соответствующие строки из df1 были добавлены как строки в df и теперь как столбцы как традиционно функция слияния объединяет кадры данных на столбцах. Результирующий кадр данных должен выглядеть следующим образом:

X  Y   Z
a 111 <NA>
a 111 xxx
c 222 <NA>
c 222 ttt

Я знаю, что это можно сделать для циклов, но мне было интересно, возможно ли это через одну / две строки кода вместо написания нескольких циклов for.

Ответы [ 2 ]

3 голосов
/ 14 февраля 2020

База R опция:

# Add missing column to df
df[setdiff(names(df1), names(df))] <- NA
# rbind only rows matching on x
rbind(df, df1[df1$x %in% df$x,])
   x   y    z
1  a 111 <NA>
2  c 222 <NA>
11 a 111  xxx
4  c 222  ttt

A dplyr опция:

library(dplyr)
bind_rows(df, filter(df1, x %in% df$x))
  x   y    z
1 a 111 <NA>
2 c 222 <NA>
3 a 111  xxx
4 c 222  ttt

A data.table опция:

library(data.table)
setDT(df)
setDT(df1)
rbind(df, df1[x %in% df$x], fill = TRUE)
   x   y    z
1: a 111 <NA>
2: c 222 <NA>
3: a 111  xxx
4: c 222  ttt
2 голосов
/ 14 февраля 2020
library(dplyr)

df1 %>%
    semi_join(df, by = "x") %>%
    bind_rows(df)

  x   y    z
1 a 111  xxx
2 c 222  ttt
3 a 111 <NA>
4 c 222 <NA>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...