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)
最终得到的结果会是:
| year | File A | File B |
|---|---|---|
| 1900 | 0.8 | 1.0 |
| 1901 | 2.1 | 1.6 |
为什么你的原方法失效?
bind_rows()是行堆叠操作,会把所有文件的行依次拼接,同年度自然会变成不同行;R为了避免行名重复,自动添加...1/...2后缀。- 你用
gsub处理行名时,正则表达式写错了:...*需要转义为\\.\\..*才能匹配后缀,但即使修正,重复行名在R中不被允许,且根本无法解决数据分散的问题——行名相同不代表数据会自动合并。
内容的提问来源于stack exchange,提问作者d4artpr
相关产品推荐
相关产品推荐

