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

如何合并列表中的data.frame并保留最新轮次的记录?

解决方案

这里提供两种实现思路,分别适用于通用场景和你的滑动窗口特定场景:

方法一:通用处理(适合任意轮次的年份重叠情况)

通过将数据转为长格式,筛选最新轮次记录后再转回宽格式:

library(dplyr)
library(tidyr)

# 给每个data.frame添加轮次标识和行号(区分不同观测行)
df_with_round <- imap(df_1, ~ .x %>%
                       mutate(row_id = row_number(), round = .y))

# 合并所有数据并转为长格式
long_data <- bind_rows(df_with_round) %>%
  pivot_longer(cols = starts_with("19"), names_to = "year", values_to = "value")

# 按行号+年份分组,仅保留最新轮次的数据
final_data <- long_data %>%
  group_by(row_id, year) %>%
  filter(round == max(round)) %>%
  ungroup() %>%
  pivot_wider(names_from = year, values_from = "value") %>%
  select(-row_id) # 移除临时行号列

方法二:滑动窗口场景优化(更高效)

利用你的数据是"新增右侧年份、移除左侧年份"的滑动窗口特性,直接通过列覆盖实现:

# 初始化最终数据框为第一个轮次的数据
final_df <- df_1[[1]]

# 遍历后续轮次,用新轮次的列覆盖旧列,同时添加新年份列
for (i in 2:length(df_1)) {
  current_df <- df_1[[i]]
  # 保留final_df中未在当前轮次出现的列,再合并当前轮次的所有列
  final_df <- bind_cols(final_df[, !names(final_df) %in% names(current_df)], current_df)
}

说明

  • 方法一的优势是通用性强,无论年份重叠规则如何都能正确筛选最新轮次;
  • 方法二避免了格式转换,运行效率更高,适合你这种固定滑动窗口的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 20:22:38