0

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、theta2、theta3...、theta20) をその名前 (たとえば、theta1) を呼び出して使用することだけです。私は何千ものデータセットを生成しているので、write.table 関数と read.table 関数を使わずにできるかどうか知りたいです。お役に立てれば幸いです。

4

3 に答える 3

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 )

それはあなたが念頭に置いていたことですか?

于 2013-06-09T05:38:29.203 に答える
0

これらの Rda ファイル内のオブジェクトはすべて同じ名前の「theta」を持つため、以前のバージョンを上書きせずにそれらをロードすることはできません。名前を付けずに保存したい場合は、さまざまな名前を付けて使用できsaveRDSますreadRDSsave()get -ed の前に別の名前を付けたい場合assignは、現在使用している方法で使用してから保存してください。

そうは言っても、さまざまな名前の 20 個のオブジェクトのリストを作成し、それらを一度に保存して一度に読み込む方がはるかに簡単です。

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"
于 2013-06-09T04:57:59.973 に答える