如何在dplyr中仅对观测数>1的组过滤保留NA行
简化dplyr分组筛选逻辑的实现
需求说明
仅保留观测数大于1的组中的NA行;对于仅含1条观测的组,无论是否存在NA,均保留所有行。
示例数据
library(dplyr) data <- data.frame( x = c(1, NA_real_, 3, NA_real_), y = c("grp1", "grp2", "grp2", "grp3") ) data #> x y #> 1 1 grp1 #> 2 NA grp2 #> 3 3 grp2 #> 4 NA grp3
当前繁琐实现
raw <- data %>% group_by(y) %>% mutate(n = n()) results <- bind_rows( raw %>% filter(n == 2) %>% filter(is.na(x)), raw %>% filter(n == 1) ) %>% ungroup() %>% select(-n) results #> # A tibble: 3 × 2 #> x y #> <dbl> <chr> #> 1 NA grp2 #> 2 1 grp1 #> 3 NA grp3
简洁实现方法
直接在分组后用单个filter语句组合条件即可,无需拆分后再合并:
data %>% group_by(y) %>% filter(n() == 1 | is.na(x)) %>% ungroup()
运行结果和上述results完全一致,逻辑是:
- 组内观测数为1的行全部保留
- 组内观测数大于1的行,仅保留
x为NA的记录
内容的提问来源于stack exchange,提问作者boshek
相关产品推荐
相关产品推荐

