gpt4 book ai didi

r - 使用 group_by 过滤特定案例,同时保留 NA

转载 作者:行者123 更新时间:2023-12-01 22:28:23 24 4
gpt4 key购买 nike

我想过滤我的数据集,以将具有观察结果的个案保留在特定列中。为了说明:

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()但是,在答案中他们使用了“全部”条件,这需要使用“任何”条件。

最佳答案

尝试

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'中的所有值> 0对'deid'进行子集化,那么上面的代码可以修改为,

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

关于r - 使用 group_by 过滤特定案例,同时保留 NA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30820684/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com