Слияние фреймов данных с помощью Reduce - как добавить опцию слияния - PullRequest
1 голос
/ 02 марта 2020

Мой код:

df1 <- data.frame("X1"=c("John","Sam","Dave"),"X2"=c(21,22,25))
df2 <- data.frame("X1"=c("John","Sam"),"X2"=c(22,25))
df3 <- data.frame("X1"=c("John","Sam","Dave"),"X2"=c("US","SA","NZ"))
mylist <- list(df1,df2,df3)
merged= Reduce(function (...) merge(..., all= T), mylist)

Мой вывод:

    X1 X2
1 Dave 25
2 Dave NZ
3 John 21
4 John 22
5 John US
6  Sam 22
7  Sam 25
8  Sam SA

Однако, вывод, который мне нужен,

  names X1    X2.x    X2.y
1  Dave  25    NA      NZ
2  John  21    22      US
3   Sam  22    25      SA 

Я понимаю, что могу получить желаемый результат, если я называю столбцы по-другому, но это не вариант здесь. В частности, я хочу знать, как добавить аргумент "by =" X1 "с функцией Reduce, который используется только в функции слияния.

1 Ответ

2 голосов
/ 02 марта 2020

то, что @caldwellst сказал в комментариях, но с некоторой подготовкой (например, нажатием клавиши).

library( data.table )
#set as data.table
lapply( mylist, setDT )
#set keys
lapply( mylist, setkey, X1)
#merge
Reduce( function(...) merge(..., all = TRUE), mylist )

#      X1 X2.x X2.y X2
# 1: Dave   25   NA NZ
# 2: John   21   22 US
# 3:  Sam   22   25 SA
...