R语言从不等列数的dataframe列表提取名称与列名生成新dataframe
R语言实现多数据框列表提取名称与列名的最优方案
需求说明
从已命名的多dataframe列表中,提取每个数据框的名称、对应列名,整合为统一dataframe,不同数据框列数不一致时自动补NA。
实现方案
方案1:tidyverse简洁实现(代码可读性高,适配后续拓展需求)
依赖包:tidyverse(核心用到purrr、tibble、dplyr)
library(tidyverse) # 示例数据 dlist <- list(mtcars[1:2], mtcars[1:3], mtcars[1:4]) names(dlist) <- c("mtcars1", "mtcars2", "mtcars3") # 核心代码 result <- dlist |> # 同时遍历列表元素和对应名称 imap_dfr(~{ # 把当前数据框的列名转为单行数据框 as_tibble_row(colnames(.x), .name_repair = ~paste0("col_", seq_along(.x))) |> # 把数据框名放在第一列 mutate(df_name = .y, .before = 1) })
运行后输出的result完全匹配预期,打印效果如下:
# A tibble: 3 × 5 df_name col_1 col_2 col_3 col_4 <chr> <chr> <chr> <chr> <chr> 1 mtcars1 mpg cyl NA NA 2 mtcars2 mpg cyl disp NA 3 mtcars3 mpg cyl disp hp
方案2:base R实现(无第三方包依赖,运行速度快)
# 计算所有数据框的最大列数,用于补全NA max_col <- max(lengths(dlist)) result <- do.call(rbind, lapply(names(dlist), function(nm) { # 提取当前数据框列名,长度不足自动补NA cols <- `length<-`(colnames(dlist[[nm]]), max_col) c(nm, cols) })) |> as.data.frame(row.names = NULL)
方案说明
- 两种方案都不需要提前手动对齐列数,自动适配任意长度的列名差异
- 若需要修改输出列名,直接修改生成列名的逻辑即可,比如把
paste0("col_", seq_along(.x))替换为自定义命名规则
内容的提问来源于stack exchange,提问作者codedancer
相关产品推荐
相关产品推荐

