【问题标题】:Running for loop across multiple groups跨多个组运行 for 循环
【发布时间】:2017-03-05 04:49:40
【问题描述】:

我在 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 列,拟合模型。
  • 提取模型估计值以用于插补。
  • 使用模型估计运行模型并将值

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

我尝试了几个选项,包括使用data_list &lt;- split(myData, myData$V12) 拆分数据框并使用lapply() 函数。但是,由于模型估计的格式,这不起作用:

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

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

【问题讨论】:

  • 请提供 essuk 或 myData 的可重现示例。

标签: r for-loop split lapply


【解决方案1】:

使用子集()怎么样?

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)
}

不是最优雅的,但应该可以。

【讨论】:

  • 这就像一个魅力!我想应该有一种方法可以使用 apply() 框架而不是双循环,但是您的建议也可以完成这项工作。此外,虽然我的数据集不是特别大,但双循环可能会导致更大的数据集或更复杂的模型出现问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2023-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多