跨多个组运行循环

时间:2017-03-05 04:49:40

标签: r for-loop split lapply

我在R中运行以下插补任务作为for循环:

myData <- essuk[c(2,3,4,5,6,12)]
myDataImp <- matrix(0,dim(myData)[1],dim(myData)[2])

lower <- c(0)
upper <- c(Inf)

for (k in c(1:5))
{
  gmm.fit1 <- gmm.tmvnorm(matrix(myData[,k],length(myData[,k]),1), lower=lower, upper=upper)

  useMu <- matrix(gmm.fit1$coefficients[1],1,1)
  useSigma <- matrix(gmm.fit1$coefficients[2],1,1)
  replaceThese <- myData[,k]<=0
  myDataImp[,k] <- myData[,k]

  myDataImp[replaceThese,k]  <- rtmvnorm(n=sum(replaceThese), c(useMu), c(useSigma), c(-Inf), c(0))
}

步骤非常简单

  • 定义数据集和空插补数据集。
  • 对于第1-5列,请安装模型。
  • 提取用于估算的模型估算。
  • 使用模型估算值运行模型,并使用插补数据集中的新值替换值&lt; = 0。

但是,我想分别针对多个组进行此操作,而不是针对完整样本。数据集中的第12列包含有关组成员资格的信息(整数范围为1-72)。

我尝试了多种选项,包括使用data_list <- split(myData, myData$V12)拆分数据框并使用lapply()功能。但是,由于模型估计的格式如何,这不起作用:

Error in as.data.frame.default(data) : 
  cannot coerce class ""gmm"" to a data.frame

我也考虑过做嵌套for循环的可能性,虽然我不确定如何实现。任何建议都非常感谢。

1 个答案:

答案 0 :(得分:1)

如何使用subset()?

myData$V12 = as.factor(myData$V12)
listofresults= c()
for (i in levels(myData$V12)){
data = subset (myData, myData$V12 == i)
  #your analysis here: result saved in myDataImp

 listofresults = c(listofresults, myDataImp)
}

不是最优雅,但应该有效。