【问题标题】:Store different sized matrices and values to a dataframe将不同大小的矩阵和值存储到数据框中
【发布时间】:2021-12-09 21:16:36
【问题描述】:

我正在使用一系列循环为项目生成一堆数据,并希望保存这些值,这样我就不必每次都继续生成它们。我的问题是数据的大小和位置变化很大(见下文),这使得正确存储变得困难。我希望将其转储到一个数据框中,其中各种矩阵占据一个单元格。

生成数据的代码

for (simulation in 1:1000){
       g <- ceiling(runif(1, min=0, max=3))
       if (g==1) {sample1 = runif(1, min=100, max=3000)}
       if (g==2) {sample1 = runif(1, min=100, max=1500)
                  sample2 = runif(1, min=100, max=1500)}
       if (g==2) {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
       for (class in 1:g){
            x1 = c()
            ... 
            x30 = c()
            for (i in 1:samplesize){
                   x1[i]=rnorm(1,1.5,1)
                   ...
                   x30[i]=rnorm(1,1.5,1)
                   
            }
      data = matrix(c(x1:x30))
      conditions[simulation,1] = g
      conditions[simulation,2] = sample1
      conditions[simulation,3] = sample2
      conditions[simulation,4] = sample3

      }
}

这会生成 30 个变量 (x1-x30),其采样次数取决于组数 (1-3)。因此,如果有一组,则可能有 (30 * 100) 到 (30 * 3000) 之间的任何变量。对于三个组,可能有 (30 * 3 * 100) 到 (30 * 3 * 1000),并且每个组的它们可以不同。因此,数据在某种程度上是有规律的,但是会发生变化。

我想要做的是获取模拟值矩阵 (x1:x30) 并将其与每个模拟的模拟条件一起存储在数据框中。这就像数据框中的第一个单元格是 x 值的嵌套矩阵,而该行中的其他单元格将是奇异值(条件)。我看过一些关于使用双括号 [[]] 执行此操作的帖子,但无法弄清楚如何在我的数据中实现此功能。感谢您提供的任何帮助!

【问题讨论】:

  • 您可以使用list 而不是data.frame

标签: r dataframe matrix


【解决方案1】:

我认为您正在谈论使用列表列作为 data.frame 的最后一列。
我使用data.table 做到了这一点。

library(data.table)
library(magrittr)
set.seed(42)
the_list <- vector('list')
for (simulation in 1:1000){
  sample1 = 1
  sample2 = 0
  sample3 = 0
  g <- ceiling(runif(1, min=0, max=3))
  if (g==1) {sample1 = runif(1, min=100, max=3000)}
  if (g==2) {sample1 = runif(1, min=100, max=1500)
  sample2 = runif(1, min=100, max=1500)}
  if (g==2) {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
  for (class in 1:g){
    x1 = c()
    x30 = c()
    for (i in 1:samplesize){
      x1[i]=rnorm(1,1.5,1)
      x30[i]=rnorm(1,1.5,1)
      
    }
    data = cbind(x1, x30)

  }
  the_list[[simulation]] <- list(simulation, g, sample1, sample2, sample3, list(data))
}
conditions <- rbindlist(the_list) %>% 
  setnames(c('sim', 'g', 'sample1', 'sample2', 'sample3', 'result'))

第二个模拟是条件[2] 或条件[sim == 2] 对于模拟 2 的前 10 行结果,您可以使用:

conditions[2]$result[[1]][1:10, ]
             x1       x30
 [1,] 3.054896 0.3123586
 [2,] 1.651813 0.4138674
 [3,] 3.113373 1.5356312
 [4,] 2.814959 2.4781675
 [5,] 2.381791 1.9822047
 [6,] 2.465753 0.6854291
 [7,] 1.783958 1.3383014
 [8,] 3.435572 3.2232308
 [9,] 1.858402 1.8024309
[10,] 1.105885 2.2881406

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多