ネストループを使用して、RでMCMCglmmを複数回実行して事後分布をデータフレームに出力しています。外側ループはMCMCプロセスを実行して事後分布を生成し、次に内側ループはこれらをそれぞれ独立したデータフレームに持ち上げる(Fはチェーンの各ランの固定効果における事後分布の数であり、nは、実行されるランダム化の数です)。したがって、F(この場合は4)のデータフレームがあり、それぞれがnカラムです。ループ内でRの可変データフレームの可変列にデータを追加する
for(i in 1:n){
# Randomise
MortR = data.frame(Year, Mortalities)
MortR[,2] = sample(MortR[,2], replace = F)
DF1 = merge(DF1, MortR, by = "Year")
DF1$Mort_R = DF1[,9]
DF1[,9] = NULL
prior1 = list(G = list( G1 = list(V = 1, nu = 1, alpha.mu = 0, alpha.V = 1000)
),
R = list(V = 1, nu = 0.002))
# Chain
assign("chainX",paste0("chain",i))
chainX = MCMCglmm(Life ~ Sex*Mort_R - 1,
random = ~Pop:Year,
rcov = ~units,
nitt = nitt,
burnin = burn,
thin = thin,
prior = prior1,
pr = T,
family = "gaussian",
start = list(QUASI = FALSE),
data = DF1)
for(j in 1:F){
assign(paste0("chainSol",j), chainX$Sol[,j])
A = as.vector(get(paste0("chainSol",j)))
assign(paste0("F",j), A)
# Aim: get vector F*j* (or A) in to column *i* of dataframe chainSolDF_*j*
# ie.: chainSolDF_*j*[,*i*] = F*j*
#chainSolDF_1[,i] = as.vector(get(paste0("chainSol",j))) # Puts it in the columns of DF_1
#assign(paste0("chainSolDF_",j)[,i], A) # Incorrect number of dimensions
#assign(paste0("chainSolDF_",j)[,i], paste0("F",j)) # Error in paste0("chainSolDF_", j)[, i] : incorrect number of dimensions
#assign(paste0("chainSolDF_",j,"[,",i,"]"), paste0("F",j)) # Does not assign to the data frame
#paste0("chainSolDF_",j,"[,",i,"]") = get(paste0("F",j)) # Invalid first argument
}
#B = matrix(c(F1,F2,F3,F4), ncol = 4)
print(paste0("Randomisation ",i, " Complete"))
}
あなたは、私は、彼らが発生したエラーの説明を(#)を試したことの一部(これは単に「ハイライト」である)を参照することができます - 無駄にすべてを!一般的に私はget()
、assign()
および$<-
のソリューションを探していました。私は3日間この問題を解決しようとしたが、私はこのコミュニティに目を向ける。
どの一つが同時に内部ネストされたループ内で指定されている両方とも特定列にベクトルと特定データ・フレームを割り当てることができますか?
「目標:列にベクトル
Fj
(またはA)を得るi
chainSolDF_j
データフレームの
を助けている場合、私に教えてください、あなたはデザインだけ離れ 'sapply' /' lapply'からshyingていますか?並列処理が起こっていないので、これは非常に適切です。 –
適切なRコードを書くときに 'get()'や 'assign()'を使うことはまれです。名前付きリストで結果を収集するほうがはるかに優れています。この例は、あまりに複雑すぎて、完全な私書箱を提供することはできません。それを簡略化する方がいいでしょう(特に 'MCMCglmm'とは関係ないようです)。質問を編集して、実際に解決しようとしている問題を分離して単純化します。また、サンプル入力データを使って[再生可能](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)にする必要があります。 – MrFlick
@romanlustrik何も理由はありません。まだ自分自身を変換することに時間がかかることはほとんどありません。ループを使って行うことのほとんどは、時間的に賢明な時間を計算するのに十分なほど強力ではありません。 – Ell