我在R中有一个data.table,它有几个id和一个值。对于每个ID组合,有几行。如果其中一行在列'值'中包含NA,我想删除具有此ID组合的所有行。例如,在下表中,我想删除id1 == 2
和id2 == 1
的所有行。
如果我只有一个身份证,我会dat[!(id1 %in% dat[is.na(value),id1])]
。在示例中,这将删除i1 == 2的所有行。但是,我没有设置包含多个列。
dat <- data.table(id1 = c(1,1,2,2,2,2),
id2 = c(1,2,1,2,3,1),
value = c(5,3,NA,6,7,3))
答案 0 :(得分:4)
如果您想检查id1
和id2
的每个组合,如果有任何值为NA
s,然后删除整个组合,您可以插入if
每个语句的语句,只检索结果(使用.SD
),如果该语句返回TRUE
。
dat[, if(!anyNA(value)) .SD, by = .(id1, id2)]
# id1 id2 value
# 1: 1 1 5
# 2: 1 2 3
# 3: 2 2 6
# 4: 2 3 7
或类似地,
dat[, if(all(!is.na(value))) .SD, by = .(id1, id2)]