R: Связывание столбцов по ключевой переменной

Я хочу объединить два кадра данных, df1 а также df2различными группами ключевой переменной в x1, Это в основном некоторая операция соединения, однако я не хочу, чтобы строки дублировались, и не заботится о связи между добавленными столбцами.

Предполагать:

df1:

x1 x2 
A  1
A  2
A  3
B  4
B  5
C  6
C  7

df2:

x1 x3 
A  a
A  b
A  c
A  d
A  e
A  f
B  g
C  h

Результат должен выглядеть следующим образом.

df1 + df2:

x1 x2 x3 
A  1  a
A  2  b
A  3  c
A  NA d
A  NA f
B  4  g
B  5  NA
C  6  h
C  7  NA

У кого-нибудь есть идея? Я был бы очень признателен за вашу помощь!

2 ответа

Full_join в dplyr тоже хорошо работает для этого. Увидеть ниже:

  #recreate your data
  library (data.table)
  library (dplyr)

  df1 <- data.table (x1 = c("A","A","A","B","B","C","C"), x2 = seq (from = 1, to = 7))

  df2 <- data.table (x1 = c("A","A","A","A","A","A","B","C"), x3 = c("a","b","c","d","e","f","g","h" ))

  df1[, rowid := rowid(x1)]

  df2[, rowid := rowid(x1)]

  df3 <- full_join (df1, df2, by = c ("x1","rowid"))

  df3$rowid <- NULL

  setorder (df3, x1)

Чтобы повторить ваш результат data.frame Вы можете создавать идентификаторы строк, x1 а затем объединить эти идентификаторы строк и x1 (но я не знаю, действительно ли это то, что вы пытаетесь достичь)

library(data.table)

df1 = read.table(text = "x1 x2 
A  1
A  2
A  3
B  4
B  5
C  6
C  7", header = T)

df2 = read.table(text = "x1 x3 
A  a
A  b
A  c
A  d
A  e
A  f
B  g
C  h", header = T)

setDT(df1) 
setDT(df2)
df1[, rowid := seq(.N), by = x1] # create rowid
df2[, rowid := seq(.N), by = x1] # create rowid

merge(df1, df2, by = c("x1", "rowid"), all = T)[, rowid := NULL][]

    x1 x2 x3
 1:  A  1  a
 2:  A  2  b
 3:  A  3  c
 4:  A NA  d
 5:  A NA  e
 6:  A NA  f
 7:  B  4  g
 8:  B  5 NA
 9:  C  6  h
10:  C  7 NA
Другие вопросы по тегам