我想过滤我的数据集,以便在特定列中保留具有观察结果的案例。举例说明:
help <- data.frame(deid = c(5, 5, 5, 5, 5, 12, 12, 12, 12, 17, 17, 17),
score.a = c(NA, 1, 1, 1, NA, NA, NA, NA, NA, NA, 1, NA))
创建
deid score.a
1 5 NA
2 5 1
3 5 1
4 5 1
5 5 NA
6 12 NA
7 12 NA
8 12 NA
9 12 NA
10 17 NA
11 17 1
12 17 NA
我想告诉dplyr保留score.a
中有任何观察的案例,包括NA值。因此,我希望它返回:
deid score.a
1 5 NA
2 5 1
3 5 1
4 5 1
5 5 NA
6 17 NA
7 17 1
8 17 NA
我运行了代码help %>% group_by(deid) %>% filter(score.a > 0)
,但它也提取了NA。谢谢你的帮助。
编辑:此处提出类似问题How to remove groups of observation with dplyr::filter() 但是,在答案中他们使用了所有&#39;条件,这需要使用“任何&#39;条件。
答案 0 :(得分:5)
尝试
library(dplyr)
help %>%
group_by(deid) %>%
filter(any(score.a >0 & !is.na(score.a)))
# deid score.a
#1 5 NA
#2 5 1
#3 5 1
#4 5 1
#5 5 NA
#6 17 NA
#7 17 1
#8 17 NA
使用data.table
library(data.table)
setDT(help)[, if(any(score.a>0 & !is.na(score.a))) .SD , deid]
# deid score.a
#1: 5 NA
#2: 5 1
#3: 5 1
#4: 5 1
#5: 5 NA
#6: 17 NA
#7: 17 1
#8: 17 NA
如果条件是使用'score.a'> gt中的所有值对'deid'进行子集化0,那么上面的代码可以修改为,
setDT(help)[, if(!all(is.na(score.a)) &
all(score.a[!is.na(score.a)]>0)) .SD , deid]
# deid score.a
#1: 5 NA
#2: 5 1
#3: 5 1
#4: 5 1
#5: 5 NA
#6: 17 NA
#7: 17 1
#8: 17 NA
假设'deid'组中的'score.a'之一小于0,
help$score.a[3] <- -1
以上代码将返回
setDT(help)[, if(!all(is.na(score.a)) &
all(score.a[!is.na(score.a)]>0, deid],
# deid score.a
#1: 17 NA
#2: 17 1
#3: 17 NA
答案 1 :(得分:2)
library(dplyr)
df%>%group_by(deid)%>%filter(sum(score.a,na.rm=T)>0)