在R中基于FIPS列共同值统一五个不同长度数据框的长度
解决方案
核心思路
- 从每个年度数据框中提取FIPS县代码列,得到5个独立的FIPS向量
- 计算这5个向量的交集,得到连续五年都提交数据的县的FIPS集合
- 用这个交集集合分别过滤每个年度的数据框,保留符合条件的观测
方法一:基础R实现
假设你的五个数据框分别命名为df2018、df2019、df2020、df2021、df2022,FIPS列名为fips(请根据实际列名替换):
- 提取所有年份的FIPS并求交集
# 生成包含各年份FIPS的列表 fips_list <- list( df2018$fips, df2019$fips, df2020$fips, df2021$fips, df2022$fips ) # 计算所有年份共有的FIPS common_fips <- Reduce(intersect, fips_list)
- 过滤每个数据框
# 逐个过滤并保存新数据框 df2018_filtered <- df2018[df2018$fips %in% common_fips, ] df2019_filtered <- df2019[df2019$fips %in% common_fips, ] df2020_filtered <- df2020[df2020$fips %in% common_fips, ] df2021_filtered <- df2021[df2021$fips %in% common_fips, ] df2022_filtered <- df2022[df2022$fips %in% common_fips, ]
如果想更高效地批量处理,可以把所有数据框先放到一个列表中:
# 将所有数据框存入列表 crime_dfs <- list( "2018" = df2018, "2019" = df2019, "2020" = df2020, "2021" = df2021, "2022" = df2022 ) # 批量过滤 filtered_crime_dfs <- lapply(crime_dfs, function(df) { df[df$fips %in% common_fips, ] }) # 访问过滤后的数据框:filtered_crime_dfs[["2018"]]
方法二:tidyverse(dplyr)实现
如果你习惯用tidyverse工具链,代码会更简洁:
- 加载包并计算共同FIPS
library(dplyr) library(purrr) # 生成数据框列表(同上) crime_dfs <- list( "2018" = df2018, "2019" = df2019, "2020" = df2020, "2021" = df2021, "2022" = df2022 ) # 提取各年份FIPS并求交集 common_fips <- crime_dfs %>% map(pull, fips) %>% # 从每个数据框中提取fips列 reduce(intersect) # 计算所有向量的交集
- 批量过滤数据框
filtered_crime_dfs <- crime_dfs %>% map(filter, fips %in% common_fips)
为什么这个方法更优
- 用
Reduce(intersect)直接对多个FIPS向量求交集,比手动多次调用intersect或用merge循环简洁得多 - 通过列表批量处理数据框,避免重复编写过滤代码,尤其适合数据框数量多的场景
- 仅针对FIPS列做匹配,完全符合你“只保留连续五年提交数据的县”的需求,不会受其他犯罪计数列的影响
内容的提问来源于stack exchange,提问作者Steven Morrison
相关产品推荐
相关产品推荐

