[英]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行) condition==TRUE
行(即第5行,col1 = a,col2 = b)具有相同值的每一行 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.