我在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函数的情况下完成。如果你能帮助我,我将非常感激。
答案 0 :(得分: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 )
这是你的想法吗?
答案 1 :(得分:0)
目前尚不清楚你想做什么,但我认为replicate
就是你所需要的。
ss <- replicate(20,replicate(N,rnorm(N,0,1)))
答案 2 :(得分:0)
这些Rda文件中的对象都将具有相同的名称'theta',因此如果不覆盖任何早期版本,您将无法加载它们。如果您想要保存它们而没有名称,可以使用saveRDS
和readRDS
为它们指定不同的名称。如果您想在获得save()
- 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"