R语言:提取命名列表内表格列名并构建目标数据框
问题:合并含单/双列table的命名列表并构建指定结构的数据框
场景1:所有table均为2列
给定命名列表mlst,其中每个元素都是含2列的table对象:
mlst=list(test1 = table(c(rep("x", 12), rep("t", 10))), test2 = table(c(rep("y", 20), rep("z", 5))), test3 = table(c(rep("w", 30), rep("m", 50))))
直接使用do.call(rbind, mlst)合并时,列名仅保留第一个table的名称,无法体现每个table自身的列名。需要构建如下结构的数据框:
v1 v2 v1t v2t test1 10 12 t x test2 20 5 y z test3 50 30 m w
场景2:存在仅含1列的table
当列表中包含单列表的table时(如mlst2):
mlst2=list(test1 = table(c(rep("x", 20), rep("t", 10))), test2 = table(c(rep("z", 30))), test3 = table(c(rep("w", 40), rep("m", 60))))
do.call(rbind, mlst2)会出现值循环填充的错误,正确结果中test2行应为30、NA、z、NA。
解决方案(避免for循环)
Base R实现
通过lapply遍历列表中的每个table,统一处理为含4个字段的结构(不足2列的补NA),再合并为最终数据框:
# 定义处理单个table的函数 process_table <- function(tbl) { # 提取table的数值和名称 tbl_vals <- as.numeric(tbl) tbl_names <- names(tbl) # 补全到2个元素,不足的填充NA tbl_vals <- c(tbl_vals, rep(NA, max(0, 2 - length(tbl_vals)))) tbl_names <- c(tbl_names, rep(NA, max(0, 2 - length(tbl_names)))) # 返回单条记录的数据框 data.frame(v1 = tbl_vals[1], v2 = tbl_vals[2], v1t = tbl_names[1], v2t = tbl_names[2], row.names = NULL) } # 处理mlst result_mlst <- do.call(rbind, lapply(mlst, process_table)) rownames(result_mlst) <- names(mlst) # 处理mlst2 result_mlst2 <- do.call(rbind, lapply(mlst2, process_table)) rownames(result_mlst2) <- names(mlst2)
验证结果:
result_mlst完全符合场景1的预期结构;result_mlst2中test2行的结果为30 NA z NA,解决了循环填充的问题。
Tidyverse实现(可选)
如果习惯使用tidyverse工具链,可通过purrr::map结合dplyr实现:
library(tidyverse) process_table_tidy <- function(tbl) { tbl_vals <- as.numeric(tbl) tbl_names <- names(tbl) tbl_vals <- c(tbl_vals, rep(NA, max(0, 2 - length(tbl_vals)))) tbl_names <- c(tbl_names, rep(NA, max(0, 2 - length(tbl_names)))) tibble(v1 = tbl_vals[1], v2 = tbl_vals[2], v1t = tbl_names[1], v2t = tbl_names[2]) } # 处理mlst result_mlst_tidy <- mlst %>% map(process_table_tidy) %>% bind_rows(.id = "group") %>% column_to_rownames("group") # 处理mlst2 result_mlst2_tidy <- mlst2 %>% map(process_table_tidy) %>% bind_rows(.id = "group") %>% column_to_rownames("group")
内容的提问来源于stack exchange,提问作者M. Beausoleil
相关产品推荐
相关产品推荐

