2016-11-07 5 views
2

Ich muss einige Set-Operationen mit nur data.table Bibliothek tun.Legen Sie Operationen mit data.table

Ich möchte nicht Join/Merge, aber Operationen einstellen. Wir stimmen also nicht Spalte für Zeile überein, sondern fügen Zeilen aus verschiedenen data.tables hinzu.

Wir arbeiten an zwei Stichproben aus integrierten Datensätzen.

Alle problematischen Fragen sind unten:

#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

Mögliche Duplikat [How (merge) beizutreten Datenrahmen (innen, außen, links, rechts)?] (http://stackoverflow.com/questions/1299871/how-to-join-merge-data-frames-inner-outer-left-right) – theArun

+0

Nein. Ich möchte nicht JOINING tun, aber Stellenangebote. Wir stimmen also nicht Spalte für Zeile überein, sondern fügen Zeilen aus verschiedenen data.tables hinzu. – AgnieszkaTomczyk

+1

Sie führen zwei data.tables basierend auf bestimmten Spalten zusammen. Die erste Zeile, nach der Sie gefragt haben, ist ein Schnittpunkt, der zweite ist ein linker_join (glaube ich) und der dritte ist ein Recht. – theArun

Antwort

1

Mit nur 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]