如何合并列表中的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
相关产品推荐
相关产品推荐

