如何将R语言中的指定小型列表转换为DataFrame?
解决方法
你的列表里每个元素都是带行名的单列结构化数据,常规的列表转DataFrame方法没法直接生成你要的笛卡尔积样式结果,得先拆分提取每个部分的类别与对应值,再生成全组合并填充数据。
方法一:基础R实现
# 提取time的类别和对应值 time_data <- data.frame( group = rownames(my_list$time), value = as.vector(my_list$time), stringsAsFactors = FALSE ) # 提取treatment的类别和对应值 treatment_data <- data.frame( group = rownames(my_list$treatment), value = as.vector(my_list$treatment), stringsAsFactors = FALSE ) # 生成所有组合 full_combinations <- expand.grid( time = time_data$group, treatment = treatment_data$group, stringsAsFactors = FALSE ) # 匹配填充对应数值 full_combinations$time <- time_data$value[match(full_combinations$time, time_data$group)] full_combinations$treatment <- treatment_data$value[match(full_combinations$treatment, treatment_data$group)] # 设置行名 rownames(full_combinations) <- paste( rownames(my_list$time)[match(full_combinations$time, time_data$value)], rownames(my_list$treatment)[match(full_combinations$treatment, treatment_data$value)], sep = "-" )
运行后得到的full_combinations就是目标结构:
time treatment Pre-Control 0 0 Post-Control 1 0 Pre-Treatment 0 1 Post-Treatment 1 1
方法二:用tidyverse简化
如果习惯用tidyverse工具链,可以更简洁:
library(tidyr) library(dplyr) result <- crossing( time = rownames(my_list$time), treatment = rownames(my_list$treatment) ) %>% mutate( time = as.integer(my_list$time[time, ]), treatment = as.integer(my_list$treatment[treatment, ]) ) %>% `rownames<-`(paste(rownames(my_list$time)[match(.$time, time_data$value)], rownames(my_list$treatment)[match(.$treatment, treatment_data$value)], sep = "-"))
两种方法核心逻辑一致:先把每个列表元素的行名(类别标签)和数值对应绑定,再生成两个类别所有可能的组合,最后匹配填充对应数值,就能得到你要的DataFrame结构。
内容的提问来源于stack exchange,提问作者Andrzej Andrzej
相关产品推荐
相关产品推荐

