繁体   English   中英

从data.table中删除满足条件的行

[英]Remove rows from data.table that meet condition

我有一个数据表

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的新手)?

您可以进行反连接:

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

#    col1 col2 condition
# 1:    c    c     FALSE

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM