如何将不同尺寸矩阵和条件数值存入R语言dataframe的单个单元格
解决方案核心
R的data.frame支持列表类型的列,你可以将每次模拟生成的矩阵作为列表元素存入同一行的列表列中,完美适配不同尺寸矩阵的存储需求,同行可以同时存储单值的条件参数。
完整实现代码
library(tibble) # 初始化结果数据框,sim_matrix为专门存储矩阵的列表列 sim_result <- tibble( sim_id = integer(0), g = integer(0), sample1 = numeric(0), sample2 = numeric(0), sample3 = numeric(0), sim_matrix = list() ) # 模拟循环 for (simulation in 1:1000) { # 初始化样本量为NA,避免不同分组数下未赋值报错 sample1 <- sample2 <- sample3 <- NA_real_ g <- ceiling(runif(1, min=0, max=3)) if (g == 1) { sample1 = runif(1, min=100, max=3000) samplesize = sample1 } else if (g == 2) { sample1 = runif(1, min=100, max=1500) sample2 = runif(1, min=100, max=1500) samplesize = sample1 + sample2 } else if (g == 3) { sample1 = runif(1, min=100, max=1000) sample2 = runif(1, min=100, max=1000) sample3 = runif(1, min=100, max=1000) samplesize = sample1 + sample2 + sample3 } # 生成30个变量的模拟矩阵,优化写法避免循环逐个赋值x1~x30 sim_data <- matrix( rnorm(n = samplesize * 30, mean = 1.5, sd = 1), nrow = samplesize, ncol = 30, dimnames = list(NULL, paste0("x", 1:30)) ) # 追加本次模拟结果到数据框,矩阵要包裹在list中才能存入单个单元格 sim_result <- rbind( sim_result, tibble( sim_id = simulation, g = g, sample1 = sample1, sample2 = sample2, sample3 = sample3, sim_matrix = list(sim_data) ) ) }
操作说明
- 提取指定模拟的矩阵:用双括号提取列表列元素即可,比如获取第5次模拟的矩阵,执行
sim_result$sim_matrix[[5]] - 结果持久化:不要保存为csv格式,会丢失嵌套的矩阵结构,使用R原生序列化方式存储:
- 保存:
saveRDS(sim_result, "sim_result.rds") - 读取:
sim_result <- readRDS("sim_result.rds")
- 保存:
- 如果你习惯用base R的data.frame,初始化时用
I()抑制列表自动展开即可:sim_result <- data.frame( sim_id = integer(), g = integer(), sample1 = numeric(), sample2 = numeric(), sample3 = numeric(), sim_matrix = I(list()) )
内容的提问来源于stack exchange,提问作者PSB
相关产品推荐
相关产品推荐

