【问题标题】:How to save simulation data using for loop in R如何在R中使用for循环保存模拟数据
【发布时间】:2013-06-09 03:35:01
【问题描述】:

我正在使用 R 中的 for 循环模拟几个数据集,并将数据集保存在文件夹中的文本文件中。由于我需要分析这些数据集,我将这些数据从文件夹导入到 R 并进行分析。我想知道是否有任何方法可以通过将它们作为数据框保存在 R 中而不是保存和导入来进行模拟和分析。这是我的代码:

setwd("C:\\Users\\John\\Desktop\\datageneration")

kitem<-10
N<-100
disc<-rnorm(k,0,1)
diff=rnorm(k,0,1)

irtp<-function(t,a,b,pexp)
{
    pexp<-1/(1+exp(-b*(t-a)))
    pexp
}
for( iter in 1:20) 
{
    X<-mat.or.vec(N,kitem)
    P<-mat.or.vec(N,kitem)
    for(i in 1:N)
    {
        theta<-rnorm(N,0,1)
        assign(paste0("theta", iter), theta)
        filename1 <- paste (" theta",iter ,".txt ", sep ="")
        write.table( get(paste0("theta",iter)) , file = filename1 , row.names =FALSE ,col.names = FALSE )
        for(k in 1:kitem)
        {
            P[i,k]<-irtp(theta[i],diff[k],disc[k],pexp)
            X[i,k]<-ifelse(runif(1)<P[i,k],1,0)
            assign(paste0("X",iter), X)         # HERE'S THE PART THAT I NEED HELP
            filename2 <- paste ("X",iter ,".txt ", sep ="")
            write.table( get(paste0("X",iter)) , file = filename2 , row.names =FALSE ,col.names = FALSE )
        }
    }
}

我要做的只是通过调用它们的名称(例如,theta1)来使用生成的数据文件(例如,theta1、theta2、theta3...、theta20)。由于我正在生成数千个数据集,我想知道是否可以在不使用 write.table 然后 read.table 函数的情况下做到这一点。如果您能帮助我,我将不胜感激。

【问题讨论】:

  • 您的模拟向量(如上面的示例代码)或更复杂的结构?您是否需要保留数据,或者只生产、使用和丢弃它们就可以了?
  • 感谢您询问 vaettchen。实际上我的代码比这个更复杂。我还生成了包含 100 行和 10 列以及 theta 向量的矩阵。为了简单起见,我只是发布了该代码。我仍然想将文件保存在我的代码中显示的文件夹中。但经过分析,我会删除其中一些不符合我标准的。简单地说,我想同时做这两种方式。我喜欢将数据集保存在一个文件中,也可以在不导入的情况下使用它们。对不起我的英语。我希望你明白我想做什么。
  • 您正在覆盖“dat”文件 19 次。
  • 不确定我是否完全理解您要做什么,但我想您需要更改内部循环中的命名,可能通过将 iterkitem 组合到 filename2 中;否则你会一直覆盖你的东西。
  • 因此我想获得两套。第一组是 theta 向量(例如,20 个 theta 向量:theta1 到 theta20)。第二组是 X 矩阵(例如,20 个 X 矩阵:X1 到 X20)。每个 X 矩阵应包含 10 个项目(kitem)/列和 100 行(N)。我对 theta 部分没问题,因为它们是向量但被 X 矩阵部分卡住了。如果我可以将 iter 和 kitem 结合起来,你确定它可以解决问题吗?

标签: r for-loop saving-data


【解决方案1】:

编辑以反映对 X 矩阵的需要: 使用您的模拟数据创建一个包含 20 + 20 个项目的列表,并相应地命名成员:

kitem<-10
N<-100
disc<-rnorm(kitem,0,1)  # not ( k, ... )
diff=rnorm(kitem,0,1)   # not ( k, ... )
pexp <- 1                   # ??? - not needed here

# the list that takes all the produced data
mySim <- as.list( NULL )

# function definition reduced to the necessary
irtp <- function( t, a, b ) {  1 / ( 1 + exp( -b * ( t -a ) ) ) }

for( iter in 1:20 )
{
  # create two matrices to be filled later
  X<-mat.or.vec(N,kitem)
  P<-mat.or.vec(N,kitem)

  # create and name the theta component
  theta = mySim[[ iter ]] <- rnorm( N, 0, 1 )
  names( mySim )[ iter ] <- paste ( "theta", iter, sep ="" )

  # fill and save the matrices
  for( i in 1:N )
  {
    for( k in 1:kitem )
    {
      P[i,k]<-irtp(theta[i],diff[k],disc[k] )  #  don"t need this: ,pexp)
      X[i,k]<-ifelse(runif(1)<P[i,k],1,0)
    }
  }
  mySim[[ 20 + iter ]] <- X
  names( mySim )[ 20 + iter ] <- paste ( "X", iter, sep ="" )
}

如果需要,您可以将列表完全保存为 R 对象。

现在您可以为每个模拟命名:

head( mySim$theta3 )
[1]  0.96068066  0.01966067 -1.25682531 -0.15128916 -0.75950710 -1.22243883

您可以将矩阵、数据框等添加到列表中

mySim$tau1 <- c( "lists", "take", "everything" )

您可以选择性地使用相应的文件名保存列表成员:

filename <- paste( names( mySim )[3], ".txt", sep = "" )
write.table( mySim$theta3, filename )

这就是你的想法吗?

【讨论】:

  • 绝对是我的想法。太感谢了!感谢您的时间和耐心...
【解决方案2】:

不清楚你想做什么,但我认为这里replicate是你需要的。

ss <- replicate(20,replicate(N,rnorm(N,0,1)))

【讨论】:

  • 很抱歉造成混淆。假设我生成了 20 个数据集(theta1 到 theta20)。我可以使用 write.table 函数将它们保存到文件夹中。然后我可以使用 read.table 函数将它们导入 R 中。没关系。但是当我在生成后调用它们的名字(例如,theta1)时,我在 R 中看不到它们。我只想跳过 write.table/read.table 部分。简单来说,就是不想保存和导入,只想在生成后直接调用数据集的名字来使用。
【解决方案3】:

这些 Rda 文件中的对象都具有相同的名称“theta”,因此如果不覆盖任何早期版本,您将无法加载它们。如果你想不带名字地保存它们,你可以使用saveRDSreadRDS 给它们不同的名字。如果你想给它们起不同的名字,然后得到save()-ed,然后使用assign,然后以你当前使用的方式保存。

话虽如此,我会更容易列出二十个具有不同名称的此类对象,然后一次保存它们并一次加载它们。

N=10
for ( iter in 1:3) 
{
      theta<-rnorm(N,0,1)
    assign(paste0("theta", iter), theta)
    filename1 <- paste (" theta",iter ,".txt ", sep ="")
    write.table( get(paste0("theta",iter)) , file = filename1 , row.names =FALSE ,col.names = FALSE )
}

> ls(patt="theta")
[1] "theta"  "theta1" "theta2" "theta3"

【讨论】:

  • 太棒了!这就是我一直在寻找的。非常感谢 DWin。你成就了我的一天,拯救了我的几天或几周;)
  • 我想我应该把我的整个代码都放进去来解决我的问题。您的解决方案适用于 theta 向量。我以为游戏结束了,但是对于代码中的矩阵部分,我尝试了与对 theta 向量所做的相同的操作,但无法得到我想要的。我还想在内循环中有 X1、X2...X20 数据集。我可能犯了一个愚蠢的错误。我试图把它放在几个不同的地方,但可以做到。如果您能告诉我如何在创建 X 部分中更正我的代码(请参阅更新的代码),我将不胜感激。
猜你喜欢
  • 2021-01-03
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多