如何将含两列数据的列表vol转换为指定格式的DataFrame?
问题描述
现有如下R语言代码生成列表vol:
vol=list() ;df=data.frame(name=c(5,2,15,4),name=c(2,0,1,2)) vol[[1]] <- dplyr::lst(!! names(df)[1] := df) df2=data.frame(dat=c(5,2,15,4),dat=c(2,0,1,2)) vol[[2]] <- dplyr::lst(!! names(df2)[1] := df2)
需要将该列表vol转换为如下格式的DataFrame:
A Par var name 5 2 name 2 0 name 15 1 name 4 2 dat 5 2 dat 2 0 dat 15 1 dat 4 2
解决方案
方法一:使用dplyr + tidyr(推荐,代码更简洁)
通过遍历列表元素,为每个子DataFrame添加标识列,再合并重命名即可:
library(dplyr) library(tidyr) # 处理每个子列表并整理格式 processed <- lapply(vol, function(item) { # 获取当前子列表的名称(对应目标列A的值) group_name <- names(item)[1] # 提取内部DataFrame,添加A列并调整列名和顺序 item[[1]] %>% mutate(A = group_name) %>% rename(Par = 1, var = 2) %>% select(A, Par, var) }) # 合并所有处理后的DataFrame final_df <- bind_rows(processed)
运行后输出的final_df就是目标格式:
A Par var 1 name 5 2 2 name 2 0 3 name 15 1 4 name 4 2 5 dat 5 2 6 dat 2 0 7 dat 15 1 8 dat 4 2
方法二:基础R实现(无需额外包)
如果不想加载第三方包,用基础R的循环和数据框操作也能完成:
processed_list <- list() for (i in seq_along(vol)) { # 获取子列表名称 group_name <- names(vol[[i]])[1] # 提取内部数据框 temp_df <- vol[[i]][[1]] # 添加A列 temp_df$A <- group_name # 重命名原列并调整顺序 colnames(temp_df) <- c("Par", "var", "A") temp_df <- temp_df[, c("A", "Par", "var")] # 存入列表 processed_list[[i]] <- temp_df } # 合并所有数据框 final_df <- do.call(rbind, processed_list)
内容的提问来源于stack exchange,提问作者Tpellirn
相关产品推荐
相关产品推荐

