我有这样的情况。 多个data.table“rbinded”。
library(data.table)
x <- data.table(id=c(1,2,3,4),dsp=c(5,6,7,8),status=c(FALSE,TRUE,FALSE,TRUE))
y <- data.table(id=c(1,2,3,4),dsp=c(6,6,7,8),status=c(FALSE,FALSE,FALSE,TRUE))
z <- data.table(id=c(1,2,3,4),dsp=c(5,6,9,8),status=c(FALSE,TRUE,FALSE,FALSE))
w <- data.table(id=c(1,2,3,4),dsp=c(5,6,7,NA),status=c(FALSE,TRUE,FALSE,TRUE))
setkey(x,id)
setkey(y,id)
setkey(z,id)
setkey(w,id)
Bigdt<-rbind(x,y,z,w)
我想获得不重复的行,如:
id dsp status
1 6 FALSE
2 6 FALSE
3 9 FALSE
4 8 FALSE
4 NA TRUE
所以我试过
Resultdt<-Bigdt[!duplicated(Bigdt)]
但结果是:
id dsp status
1 5 FALSE
2 6 TRUE
3 7 FALSE
4 8 TRUE
与我的期望不符。 我尝试了不同的方法(因为rbind不是强制性的),例如merge,join等,data.table包似乎可能是包含解决方案的那个......显然。有什么想法吗?
答案 0 :(得分:9)
你可以做到
Bigdt[, .N, by=names(Bigdt)][N == 1L][, N := NULL][]
id dsp status
1: 1 6 FALSE
2: 2 6 FALSE
3: 3 9 FALSE
4: 4 8 FALSE
5: 4 NA TRUE
要查看其工作原理,请只运行DT[][][][]
链的一部分:
Bigdt[, .N, by=names(Bigdt)]
Bigdt[, .N, by=names(Bigdt)][N == 1L]
Bigdt[, .N, by=names(Bigdt)][N == 1L][, N := NULL]
答案 1 :(得分:3)
您也可以尝试
Bigdt[!(duplicated(Bigdt)|duplicated(Bigdt, fromLast=TRUE))]
# id dsp status
#1: 1 6 FALSE
#2: 2 6 FALSE
#3: 3 9 FALSE
#4: 4 8 FALSE
#5: 4 NA TRUE
或者如果我们使用.SD
Bigdt[Bigdt[,!(duplicated(.SD)|duplicated(.SD, fromLast=TRUE))]]
或者另一个选项是按列名分组,找到带有.I
的行索引并将数据集子集
Bigdt[Bigdt[, .I[.N==1], by = names(Bigdt)]$V1]