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

Only keep levels that are incomplete, based on two columns

在以下方面我真的需要一些帮助:

我一些示例数据:

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

我想删除所有填满值 1 和值 2 的组(如 D 组)或组内没有值 2 数据的所有组(如组 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 = .()]

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

有人知道我该怎么做吗?

类似于:

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)

使用来自@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

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