如何基于变量非NA观测数筛选州后合并两个数据集?
数据集合并与州级筛选解决方案
需求说明
需要合并两个共享State(州)和Year(年份)字段的数据集:df1包含变量X1,df2包含变量X2。筛选规则为:
- 仅保留**
X1非NA观测数≥2且X2非NA观测数≥2**的州 - 保留这些州的所有年份记录,即便该年份的
X1和X2均为NA
问题分析
直接使用inner_join(df1, df2)无法满足需求,因为它仅匹配两个数据集在State和Year同时存在的记录,无法基于州级别的非NA观测数量进行筛选。
解决方案代码
# 加载dplyr包(若未安装,先执行 install.packages("dplyr")) library(dplyr) # 示例数据集 df1 = read.table( text = "State Year X1 A 1 NA A 2 NA A 3 5 A 4 NA B 1 NA B 2 NA B 3 4 B 4 3", header = TRUE) df2 = read.table( text = "State Year X2 A 1 NA A 2 5 A 3 7 A 4 NA B 1 NA B 2 2 B 3 5 B 4 7", header = TRUE) # 1. 统计每个州的X1非NA观测数 state_x1_count <- df1 %>% group_by(State) %>% summarise(x1_non_na = sum(!is.na(X1))) # 2. 统计每个州的X2非NA观测数 state_x2_count <- df2 %>% group_by(State) %>% summarise(x2_non_na = sum(!is.na(X2))) # 3. 筛选符合条件的州(此处阈值设为2,实际使用时可改为5) valid_states <- state_x1_count %>% inner_join(state_x2_count, by = "State") %>% filter(x1_non_na >= 2, x2_non_na >= 2) %>% pull(State) # 4. 合并数据集并保留有效州的所有记录 newdf <- df1 %>% full_join(df2, by = c("State", "Year")) %>% filter(State %in% valid_states) # 输出结果 print(newdf)
代码解释
- 统计非NA数量:通过
group_by(State)按州分组,sum(!is.na(X))计算每个州对应变量的非NA观测数 - 筛选有效州:合并两个统计结果,过滤出同时满足
X1和X2非NA数达标州,提取州列表 - 合并与过滤:用
full_join合并原始数据集(保留所有State和Year的组合),再过滤出有效州的所有记录
执行后得到的newdf与示例目标结果完全一致:排除州A(X1仅1个非NA观测),保留州B的所有年份记录。
内容的提问来源于stack exchange,提问作者Jens
相关产品推荐
相关产品推荐

