R语言:如何基于指定年份的NA值有条件移除数据分组
问题:按指定年份的非NA值筛选城市分组
我需要基于以下数据集,筛选出第4年和第5年的value均不为NA的城市分组,保留这些城市的所有年份数据,移除不符合条件的城市全部行:
df <- tibble(city =c("la", "la", "la", "la", "la", "nyc", "nyc", "nyc", "nyc", "nyc", "bos", "bos", "bos", "bos", "bos"), year = c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5), value=c(NA, NA, NA, 20, 25, 18, 29, 24, 17, 30, 12, 19, 17, 22, NA))
数据集预览:
# A tibble: 15 × 3 city year value <chr> <dbl> <dbl> 1 la 1 NA 2 la 2 NA 3 la 3 NA 4 la 4 20 5 la 5 25 6 nyc 1 18 7 nyc 2 29 8 nyc 3 24 9 nyc 4 17 10 nyc 5 30 11 bos 1 12 12 bos 2 19 13 bos 3 17 14 bos 4 22 15 bos 5 NA
具体需求
- 保留
la的全部5行(第4、5年value均不为NA) - 保留
nyc的全部5行(所有年份value均不为NA) - 移除
bos的全部行(第5年value为NA)
之前的方案会筛选所有年份无NA的城市,导致la也被移除,不符合需求:
df %>% group_by(city) %>% filter(!anyNA(value))
解决方案
针对性检查第4年和第5年的value是否都不为NA即可,以下两种写法都能实现需求:
写法一:用all()批量检查指定年份
library(dplyr) df %>% group_by(city) %>% filter(all(!is.na(value[year %in% c(4, 5)]))) %>% ungroup()
写法二:分别检查第4年和第5年
df %>% group_by(city) %>% filter(!is.na(value[year == 4]) & !is.na(value[year == 5])) %>% ungroup()
运行后会得到符合要求的结果:仅保留la和nyc的所有行,bos的行全部被移除。
内容的提问来源于stack exchange,提问作者dd_data
相关产品推荐
相关产品推荐

