维度不等时如何从列表元素生成指定格式的数据框?
嵌套列表转指定格式数据框的R实现
问题背景
现有如下结构的R嵌套列表作为模型输出:
Test <- vector("list" ,2) names(Test) <- c("Test1", "Test 2") Test$Test1$factor <- c("Drug1" = 0.036) Test$Test1$P <- c("Drug1" = 0.066, "P" = 0.69) Test$Test1$W <- c("Drug1" = 0.084, "W" = 0.0005) Test$Test2$factor <- c("Drug2" = 0.036) Test$Test2$P <- c("Drug2" = 0.096, "P" = 0.069) Test$Test2$W <- c("Drug2" = 0.046, "W" = 0.0105)
需要将每个子列表(Test1、Test 2)转换为指定格式的数据框,示例输出(Test1对应)如下:
data.frame("Resp" = rep("Test1",length(Test$Test1)), Factor = rep("Drug1",length(Test$Test1)), pvalue_factor = c( 0.036, 0.066, 0.084), Vars = c(NA, names(Test$Test1)[-1]), pvalue_vars = c(NA, 0.690, 0.0005))
解决方案
基础R循环实现
无需额外包,直接用循环遍历每个测试项:
# 初始化存储结果的列表 result_list <- list() # 遍历每个测试名称 for (test_name in names(Test)) { current_test <- Test[[test_name]] # 提取因子(药物)名称 factor_name <- names(current_test$factor) # 提取所有与因子名称匹配的p值 p_factor_vals <- unlist(current_test)[names(unlist(current_test)) == factor_name] # 提取Vars对应的p值 vars_p_vals <- unlist(current_test)[names(unlist(current_test)) != factor_name] # 构建目标数据框 output_df <- data.frame( Resp = rep(test_name, length(current_test)), Factor = rep(factor_name, length(current_test)), pvalue_factor = p_factor_vals, Vars = c(NA, names(current_test)[-1]), pvalue_vars = c(NA, vars_p_vals), stringsAsFactors = FALSE ) result_list[[test_name]] <- output_df } # 查看结果 result_list$Test1 result_list$`Test 2`
函数式编程实现(purrr包)
如果已安装purrr包,可用更简洁的函数式写法:
library(purrr) # 批量处理所有测试项 result_list <- map(names(Test), function(test_name) { current_test <- Test[[test_name]] factor_name <- names(current_test$factor) p_factor_vals <- unlist(current_test)[names(unlist(current_test)) == factor_name] vars_p_vals <- unlist(current_test)[names(unlist(current_test)) != factor_name] data.frame( Resp = rep(test_name, length(current_test)), Factor = rep(factor_name, length(current_test)), pvalue_factor = p_factor_vals, Vars = c(NA, names(current_test)[-1]), pvalue_vars = c(NA, vars_p_vals), stringsAsFactors = FALSE ) }) %>% # 为结果列表命名 set_names(names(Test)) # 输出结果 print(result_list$Test1) print(result_list$`Test 2`)
内容的提问来源于stack exchange,提问作者Abbas
相关产品推荐
相关产品推荐

