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

R中如何合并数据框里同一年份的分散行?

解决方案:按年份合并多CSV文件至同一行

你的核心问题是误用了行堆叠(bind_rows)而非按键合并(join),导致同年度数据分散到不同行。以下是直接可行的优化方案:


步骤1:重构文件读取逻辑

首先要把每个CSV中的年份从行名转为显式列(作为合并的主键),同时给每个文件的测量列命名为对应文件名,避免列名冲突:

# 加载必要包
library(dplyr)
library(purrr)

# 获取所有目标CSV文件
dataset_files <- list.files(pattern = "*.csv")

# 批量读取并预处理每个文件
dataset_list <- lapply(dataset_files, function(file) {
  # 读取文件,假设行名为年份(如果年份是CSV第一列则去掉row.names=1)
  df <- read.csv(file, row.names = 1)
  # 将行名转为year列
  df$year <- rownames(df)
  rownames(df) <- NULL
  # 调整列顺序,把year放在首位
  df <- df %>% select(year, everything())
  # 将测量列重命名为文件名(去掉.csv后缀)
  colnames(df)[2] <- gsub("\\.csv$", "", file)
  return(df)
})

步骤2:按年份合并所有数据框

用reduce()+full_join()按year列合并,自动将同年度的测量值对齐到同一行:

merged_data <- dataset_list %>%
  reduce(full_join, by = "year")

# 可选:将year转为数值类型方便后续分析
merged_data$year <- as.numeric(merged_data$year)

最终得到的结果会是:

yearFile AFile B
19000.81.0
19012.11.6

为什么你的原方法失效?

  1. bind_rows()是行堆叠操作,会把所有文件的行依次拼接,同年度自然会变成不同行;R为了避免行名重复,自动添加...1/...2后缀。
  2. 你用gsub处理行名时,正则表达式写错了:...*需要转义为\\.\\..*才能匹配后缀,但即使修正,重复行名在R中不被允许,且根本无法解决数据分散的问题——行名相同不代表数据会自动合并。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 15:52:37