使用data.table设置操作

时间:2016-11-07 12:37:41

标签: r data.table

我需要使用 only data.table库进行一些设置操作。

我不想加入/合并,但设置操作。所以我们不是逐列匹配,而是添加来自不同data.tables的行。

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

所有有问题的问题如下:

#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?

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分:1)

要详细说明弗兰克的评论,data.table v1.9.8及更高版本具有内置的行设置操作。我希望使用fsetdifffintersect解决方案,因为不需要设置密钥。

#first problem
fintersect(Adt,Bdt)

#second problem
fsetdiff(Adt,Bdt)

#third problem
fsetdiff(Bdt,Adt)

它也被认为是快速的: https://github.com/Rdatatable/data.table/blob/master/NEWS.0.md