基于两列,仅保留不完整的级别

时间:2018-11-15 11:28:48

标签: r na delete-row

我真的可以在以下方面提供帮助:

我有一些示例数据:

Group<-c("A","A","B","B","C","C","D", "D")
Value1<-c("7","1",8,7,"NA",9,10,12)
Value2<-c("NA","NA","NA",7,3,9,7,4)
df<-data.frame(Group, Value1, Value2)

  Group Value1 Value2
     A      7     NA
     A      1     NA
     B      8     NA
     B      7      7
     C     NA      3
     C      9      9
     D     10      7
     D     12      4

我要删除为Value1和Value2完全填充的所有组(如组D),或在组中没有为Value2填充任何数据的组(如Group A)。这样我最终得到的是为Value1和Value2填充但不完整的组,例如:

  Group Value1 Value2
     B      8     NA
     B      7      7
     C     NA      3
     C      9      9

我知道如何删除NA,我已经尝试了一些操作

setDT()[,  := if(any(Value2==)) "" else "" , by = .()]

但是在这种情况下我现在真的不知道如何使用它。

有人知道我该怎么做吗?

2 个答案:

答案 0 :(得分:2)

使用来自@ arg0naut的数据(将NA保留为NA而不是“ NA”),使用两个ave的基本R解决方案将是

df[!with(df, ave(complete.cases(df), Group, FUN = all) | 
             ave(is.na(Value2), Group, FUN = all)), ]

#  Group Value1 Value2
#3     B      8     NA
#4     B      7      7
#5     C     NA      3
#6     C      9      9

我们分别保留两个条件,找到我们不想选择的行,然后取反。

答案 1 :(得分:1)

类似的东西:

setDT(df)[, .SD[!all(is.na(Value2)) & (anyNA(Value1) | anyNA(Value2))], Group]

输出:

   Group Value1 Value2
1:     B      8     NA
2:     B      7      7
3:     C   <NA>      3
4:     C      9      9

请注意,为使此功能正常运行,您的值的确应该为NA,而不仅仅是字符串形式的"NA",即它可以与修改后的数据框示例一起使用:

Group<-c("A","A","B","B","C","C","D", "D")
Value1<-c("7","1",8,7,NA,9,10,12)
Value2<-c(NA,NA,NA,7,3,9,7,4)
df<-data.frame(Group, Value1, Value2)