在数据框中,如何使用条件删除某些行

时间:2015-07-17 09:48:06

标签: r dataframe

这是我的数据:

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

希望得到你的回答!

1 个答案:

答案 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