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

R语言:优雅合并行数不同的数据框列表并以列表名重命名所有列

问题:合并行数不同的数据框列表(带动态列重命名)

这是此前一个相似问题的跟进提问,我已获得帮助,但无法修改原有方案以满足新需求。我拥有一个包含行数不同的数据框的列表,希望用每个数据框对应的列表名称重命名其所有列(而非仅第一列),接着为每个数据框添加行号列,以此通过合并实现类似cbind的无回收合并。

测试数据

# 创建测试数据框列表
df1 <- data.frame(border=c(1,2,3), value=c(4,5,6))
df2 <- data.frame(border=as.factor(c("A","B")), value=c(3,5.7))
df_lst <- list(df1, df2)
names(df_lst) <- c("df1","df2")

期望输出

df1 border df1 value df2 border df2 value
1          1         4          A       3.0
2          2         5          B       5.7
3          3         6       <NA>        NA

手动实现方式(需优化为批量处理)

# 硬编码添加列表名称到列名(需改为动态处理)
names(df1) <- c("df1 border", "df1 value")
names(df2) <- c("df2 border", "df2 value")

# 添加用于合并的行号列
df1$row_id <- row.names(df1)
df2$row_id <- row.names(df2)

# 合并所有数据框(需改为基于列表批量处理)
df <- merge(df1, df2, all.x=T, all.y=T)

优雅的批量处理方案

方案1:Base R实现

# 批量处理列表中的每个数据框:重命名列 + 添加行号
processed_lst <- Map(function(df, name) {
  names(df) <- paste(name, names(df))
  df$row_id <- seq_len(nrow(df))
  df
}, df_lst, names(df_lst))

# 批量合并所有处理后的数据框
result <- Reduce(function(x, y) merge(x, y, by = "row_id", all = TRUE), processed_lst)

# 移除用于合并的row_id列
result <- result[, !names(result) %in% "row_id"]

方案2:Tidyverse实现

library(tidyverse)

# 批量处理:动态重命名列 + 添加行号
processed_lst <- imap(df_lst, ~ .x %>%
                        rename_with(~ paste(.y, .x)) %>%
                        mutate(row_id = row_number()))

# 批量全连接合并,最后移除行号列
result <- processed_lst %>%
  reduce(full_join, by = "row_id") %>%
  select(-row_id)

两种方案均可得到你期望的输出,无需逐个手动处理数据框。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 18:55:04