仅保留不完整的级别,基于两列
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的行,然后取反。
在以下方面我真的需要一些帮助:
我一些示例数据:
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的行,然后取反。