You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将多个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)

关键逻辑说明

两种方法的核心思路一致:

  1. 先把所有年份的长格式数据合并成一个大数据集
  2. 筛选出记录数等于总年份数的ID——因为每个年份对应一条记录,只有在所有年份都存在的ID,其记录数才会和总年份数相等

如果你有5个年份的DataFrame,只需要把df1, df2, df3替换成df1, df2, df3, df4, df5即可,代码会自动识别总年份数,无需手动修改。

至于你提到的reshape2包的面板数据函数,它主要负责数据的宽长格式转换,本身没有筛选完整案例的功能,需要配合上述筛选步骤才能达到需求。

内容的提问来源于stack exchange,提问作者Sam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 21:09:32