2013-11-11 4 views
4

ВПЛ Пусть выполнены таблицы 3 данных:R: Объединить data.table и заполнить

dt1<-data.table(Type=c("a","b"),x=1:2) 
dt2<-data.table(Type=c("a","b"),y=3:4) 
dt3<-data.table(Type=c("c","d"),z=3:4) 

Я хочу, чтобы объединить их в 1 таблицу данных, поэтому я делаю это:

dt4<-merge(dt1,dt2,by="Type") # No error, produces what I want 
dt5<-merge(dt4,dt3,by="Type") # Produces empty data.table (0 rows) of 4 cols: Type,x,y,z 

Есть способ сделать Dt5 как это вместо ?:

> dt5 
    Type x y z 
1: a 1 3 NA 
2: b 2 4 NA 
3: c NA NA 3 
4: d NA NA 4 
+0

Посмотрите на запись справки для 'merge'. Есть аргумент под названием «все». – TheComeOnMan

+0

+1 для краткого автономного воспроизводимого примера, с желаемым результатом и тем, что вы пытались сделать. Это отличный пример того, как правильно задавать вопрос, и я удивлен, что у него больше нет бонусов. –

+0

@ SimonO101, я дал ему +1 по той же причине. Я удивлен, что на самом деле там проголосовали. – A5C1D2H2I1M1N2O1R2T1

ответ

5

в то время как вы исследуете all аргумент merge, я также предлагаю Вам альтернативу, могли бы хотеть рассмотреть:

Reduce(function(x, y) merge(x, y, by = "Type", all = TRUE), list(dt1, dt2, dt3)) 
# Type x y z 
# 1: a 1 3 NA 
# 2: b 2 4 NA 
# 3: c NA NA 3 
# 4: d NA NA 4 
+0

Интересно. Могу ли я сказать, что это быстрее, так как в подсказке говорится: «Текущая реализация не рекурсивна, чтобы обеспечить стабильность и масштабируемость».? –

+0

'Уменьшить' на' data.table'? Это что-то вроде «data.table'y»? –

+0

Хотя у меня есть значок для [tag: data.table], я признаю, что совсем не знаю «путь». :-( – A5C1D2H2I1M1N2O1R2T1

6

Если вы заранее знаете, уникальные значения, которые вы имеете в вашем Type колонке вы можете использовать J, а затем объединять таблицы в data.table путь. Вы должны установить ключ для каждой таблицы, так data.table знает, что присоединиться на, как это ...

# setkeys 
setkey(dt1 , Type) 
setkey(dt2 , Type) 
setkey(dt3 , Type) 


# Join 
dt1[ dt2[ dt3[ J(letters[1:4]) , ] ] ] 
# Type x y z 
#1: a 1 3 NA 
#2: b 2 4 NA 
#3: c NA NA 3 
#4: d NA NA 4 

Это показывает сложные запросы data.table «s (т.е. dt1[dt2[dt3[...]]]), которые являются злыми!

Если вы не знаете заранее, уникальные значения для столбца ключа вы можете составить список таблиц и использовать lapply быстро запустить через них получать уникальные значения, чтобы сделать ваше выражение J ...

# A simple way to get the unique values to make 'J', 
# assuming they are in the first column. 
ll <- list(dt1 , dt2 , dt3) 
vals <- unique(unlist(lapply(ll , `[` , 1))) 
#[1] "a" "b" "c" "d" 

Затем используйте его, как и раньше, т.е. dt1[ dt2[ dt3[ J(vals) , ] ] ].

+0

Хорошо, хорошо. Имейте +1 :-) – A5C1D2H2I1M1N2O1R2T1

Смежные вопросы