R语言批量修改列表内数据框列名 实现rbind行合并
问题描述
通过lapply批量读取多个表格存入列表对象后,所有表格的第10列(即最后一列)列名不统一,无法直接调用rbind完成行合并。
需要实现的处理逻辑:
- 对列表内的每个数据框,新增名为
ID的列,列值为对应数据框第10列的原始列名 - 将所有数据框的第10列列名统一重命名为
X - 处理完成后即可正常执行行合并操作
初始代码与问题
初始读入文件的代码如下:
file_list <- list.files(pattern = "edit") tables <- lapply(file_list, read.csv, header = T, sep="\t") # 查看列表中第984个数据框的列名 colnames(tables[[984]]) [1] "X.CHROM" "POS" "ID" [4] "REF" "ALT" "QUAL" [7] "FILTER" "INFO" "FORMAT" [10] "ID02020886"
之前尝试编写的代码未达到预期效果,问题在于该逻辑错误地将文件名赋值给了新增的ID列,不符合需求:
tables <- map2(tables, file_list, ~cbind(.x, ID = .y)) #Does not work....
预期处理效果
处理完成后,第984个数据框的列名应如下所示:
colnames(tables[[984]]) [1] "X.CHROM" "POS" "ID" [4] "REF" "ALT" "QUAL" [7] "FILTER" "INFO" "FORMAT" [10] "X" "ID"
可运行解决代码
直接用基础包的lapply遍历列表逐表处理即可,不需要额外依赖,逻辑完全匹配需求:
tables <- lapply(tables, function(current_df) { # 提取当前表第10列的原始列名 target_col_name <- colnames(current_df)[10] # 新增ID列,赋值为提取到的原始列名 current_df[["ID"]] <- target_col_name # 将第10列统一重命名为X colnames(current_df)[10] <- "X" return(current_df) }) # 处理完成后直接执行行合并即可 merged_df <- do.call(rbind, tables)
内容的提问来源于stack exchange,提问作者user2300940
相关产品推荐
相关产品推荐

