如何将多个DataFrame合并为仅含完整案例的面板数据?
合并多年份DataFrame生成仅含完整案例的面板数据
方法一:基础R实现
先将所有年份的DataFrame合并,再筛选出在所有年份都存在的ID:
# 合并所有年份数据 combined_df <- rbind(df1, df2, df3) # 计算总年份数(如果是5个年份会自动识别为5) total_years <- length(unique(combined_df$year)) # 筛选出在每一年都有记录的ID valid_ids <- names(which(table(combined_df$ID) == total_years)) # 提取符合条件的观测并排序 final_df <- combined_df[combined_df$ID %in% valid_ids, ] final_df <- final_df[order(final_df$ID, final_df$year), ] rownames(final_df) <- NULL # 重置行名,让结果更整洁
方法二:Tidyverse(dplyr+tidyr)实现
用tidyverse的链式语法更简洁直观:
library(dplyr) library(tidyr) final_df <- bind_rows(df1, df2, df3) %>% # 按ID分组 group_by(ID) %>% # 只保留记录数等于总年份数的组(即每一年都有数据) filter(n() == length(unique(.$year))) %>% ungroup() %>% # 按ID和年份排序 arrange(ID, year)
关键逻辑说明
两种方法的核心思路一致:
- 先把所有年份的长格式数据合并成一个大数据集
- 筛选出记录数等于总年份数的ID——因为每个年份对应一条记录,只有在所有年份都存在的ID,其记录数才会和总年份数相等
如果你有5个年份的DataFrame,只需要把df1, df2, df3替换成df1, df2, df3, df4, df5即可,代码会自动识别总年份数,无需手动修改。
至于你提到的reshape2包的面板数据函数,它主要负责数据的宽长格式转换,本身没有筛选完整案例的功能,需要配合上述筛选步骤才能达到需求。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

