我有一个数据表
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的新手)?
答案 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