我真的可以在以下方面提供帮助:
我有一些示例数据:
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 = .()]
但是在这种情况下我现在真的不知道如何使用它。
有人知道我该怎么做吗?
答案 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)