从data.table中删除满足条件

时间:2017-09-20 23:16:26

标签: r data.table

我有一个数据表

DT <- data.table(col1=c("a", "b", "c", "c", "a"), col2=c("b", "a", "c", "a", "b"), condition=c(TRUE, FALSE, FALSE, TRUE, FALSE))

   col1 col2 condition
1:    a    b      TRUE
2:    b    a     FALSE
3:    c    c     FALSE
4:    c    a      TRUE
5:    a    b     FALSE

并希望在以下条件下删除行:

  • condition==TRUE(第1行和第4行)
  • 的每一行
  • 每行具有相同的col1和col2值,而行为condition==TRUE(即第5行,col1 = a,col2 = b)
  • 最后每行具有相同的col1和col2值condition==TRUE,但切换了col1和col2(即第2行,col1 = b,col2 = a)

所以只剩下第3行。

我这样做的方法是创建一个新数据表DTcond,其中所有行都满足条件,循环遍历col1和col2的值,并从DT收集将被删除的索引。

DTcond <- DT[condition==TRUE,]
indices <- c()
for (i in 1:nrow(DTcond)) {
    n1 <- DTcond[i, col1]
    n2 <- DTcond[i, col2]
    indices <- c(indices, DT[ ((col1 == n1 & col2 == n2) | (col1==n2 & col2 == n1)), which=T])
}

DT[!indices,]
   col1 col2 condition
1:    c    c     FALSE

这可行,但对于大型数据集来说速度很慢,我想在data.table中必须有其他方法可以在没有循环或应用的情况下执行此操作。任何建议我如何改进这个(我是data.table的新手)?

1 个答案:

答案 0 :(得分:4)

您可以进行反加入:

mDT = DT[(condition), !"condition"][, rbind(.SD, rev(.SD), use.names = FALSE)]
DT[!mDT, on=names(mDT)]

#    col1 col2 condition
# 1:    c    c     FALSE