簡體   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