2016-11-07 102 views
2

我需要做一些操作,使用只有 data.table库。我不想加入/合并,但设置操作。所以我们不按键匹配列,而是添加来自不同data.tables的行。使用data.table设置操作

我们处理来自内置数据集的两个样本。

所有的问题的问题是下面:

#install.packages("nycflights13") 
library(nycflights13) 

#install.packages("sqldf") 
library(sqldf) 

#install.packages("data.table") 
library(data.table) 

dt_airports <- data.table(airports) 

Adt <- dt_airports[1:10] 
Bdt <- dt_airports[6:15] 

sqldf('SELECT * FROM A INTERSECT SELECT * FROM B') 
# can I do it better using data.table? 
rbindlist(list(Adt,Bdt))[duplicated(rbindlist(list(Adt,Bdt))),] 

sqldf('SELECT * FROM A EXCEPT SELECT * FROM B') 
# how to do it using data.table? 

sqldf('SELECT * FROM B EXCEPT SELECT * FROM A') 
# how to do it using data.table? 
+0

的[如何加入(合并)的数据帧(内,外,左可能的复制,右)?](http://stackoverflow.com/questions/1299871/how-to-join-merge-data-frames-inner-outer-leftright) – theArun

+0

不,我不想加入,但设置操作。所以我们不按键匹配列,而是添加来自不同data.tables的行。 – AgnieszkaTomczyk

+1

您正在合并两个基于特定列的data.tables。你要求的第一行是相交,第二行是left_join(我认为),第三行是右。 – theArun

回答

1

只使用data.table:

sqldf('SELECT * FROM A INTERSECT SELECT * FROM B') 
# data.table 
rbindlist(list(Adt,Bdt))[duplicated(rbindlist(list(Adt,Bdt))),] 
# better in data.table 
setkeyv(Adt,colnames(Adt)[1:7]) 
Adt[Bdt, nomatch=0L] 

sqldf('SELECT * FROM A EXCEPT SELECT * FROM B') 
# data.table 
setkeyv(Adt,colnames(Adt)[1:7]) 
Adt[!Bdt] 

sqldf('SELECT * FROM B EXCEPT SELECT * FROM A') 
# data.table 
setkeyv(Bdt,colnames(Bdt)[1:7]) 
Bdt[!Adt]