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
相关产品推荐
相关产品推荐

