这是我的数据:
ID nb ecart
ID1 3 NA
ID1 3 0
ID1 3 1.5
ID2 2 NA
ID2 2 648
ID3 4 NA
ID3 4 0
ID3 4 0
ID3 4 7
ID4 2 NA
ID4 2 37
我想删除ecart=0
的行,并删除相关ID的所有行。
以下是预期结果:
ID nb ecart
ID2 2 NA
ID2 2 648
ID4 2 NA
ID4 2 37
希望得到你的回答!
答案 0 :(得分:5)
尝试
library(dplyr)
df1 %>%
group_by(ID) %>%
filter(!any(ecart==0 & !is.na(ecart)))
# ID nb ecart
#1 ID2 2 NA
#2 ID2 2 648
#3 ID4 2 NA
#4 ID4 2 37
或者
library(data.table)
setDT(df1)[, if(!any(ecart==0 & !is.na(ecart))) .SD, ID]
# ID nb ecart
#1: ID2 2 NA
#2: ID2 2 648
#3: ID4 2 NA
#4: ID4 2 37
或者@David Arenburg建议,我们可以通过略微改变条件来使用all
代替any
setDT(df1)[, if(all(na.omit(ecart) != 0L)) .SD, by = ID]
# ID nb ecart
#1: ID2 2 NA
#2: ID2 2 648
#3: ID4 2 NA
#4: ID4 2 37
或使用base R
subset(df1, !ID %in% unique(ID[ecart==0 & !is.na(ecart)]))
# ID nb ecart
#4 ID2 2 NA
#5 ID2 2 648
#10 ID4 2 NA
#11 ID4 2 37