2017-03-05 89 views
0

我正在運行中的R以下歸集任務作爲一個循環:運行跨多組循環

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列,適合模型。
  • 提取用於插補的模型估計值。
  • 使用模型估計運行模型,並用插值數據集中的新值替換值< = 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 

我也想過做一個嵌套循環的可能性,但我不知道怎麼會來完成。任何建議,非常感謝。

+0

請提供可重現的essuk或myData示例。 – Djork

回答

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

不是最優雅的,但應該工作。

+0

這就像一個魅力!我想應該有一個解決方法使用apply()框架,而不是一個雙循環,但你的建議也在做這項工作。另外,雖然我的數據集不是特別大,但雙循環可能會導致大數據集或更復雜模型的問題。 – thesixmax