2016-05-12 4 views
1

ネストループを使用して、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データフレームの
+0

を助けている場合、私に教えてください、あなたはデザインだけ離れ 'sapply' /' lapply'からshyingていますか?並列処理が起こっていないので、これは非常に適切です。 –

+1

適切なRコードを書くときに 'get()'や 'assign()'を使うことはまれです。名前付きリストで結果を収集するほうがはるかに優れています。この例は、あまりに複雑すぎて、完全な私書箱を提供することはできません。それを簡略化する方がいいでしょう(特に 'MCMCglmm'とは関係ないようです)。質問を編集して、実際に解決しようとしている問題を分離して単純化します。また、サンプル入力データを使って[再生可能](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)にする必要があります。 – MrFlick

+0

@romanlustrik何も理由はありません。まだ自分自身を変換することに時間がかかることはほとんどありません。ループを使って行うことのほとんどは、時間的に賢明な時間を計算するのに十分なほど強力ではありません。 – Ell

答えて

1

ここでこれはちょうど同じ2つのためにを使用してデータフレームchainSolDF_jの列Iに値を代入されループ

# creating mock data for the dataframes 
chainSolDF_1 <- data.frame(col1 = 1:10, col2 = 1:10, col3 = 1:10) 
chainSolDF_2 <- data.frame(col1 = 1:10, col2 = 1:10, col3 = 1:10) 
chainSolDF_3 <- data.frame(col1 = 1:10, col2 = 1:10, col3 = 1:10) 

# assigning values of A into column i of dataframe chainSolDF_j 
for (i in 1:3) { 
    for (j in 1:3) { 
    # creating mock data for A 
    A <- 0L 
    eval(expr = parse(text = paste0("chainSolDF_", j, "[, ", i, "] <- A"))) 
    } 
} 

編集:

を使用し、質問へのより関連していると

for(j in 1:F){ 
    assign(paste0("chainSol",j), chainX$Sol[,j]) 
    A = as.vector(get(paste0("chainSol",j))) 
    eval(expr = parse(text = paste0("chainSolDF_", j, "[, ", i, "] <- A"))) 
} 

のようなforループJで

eval(expr = parse(text = paste0("chainSolDF_", j, "[, ", i, "] <- A"))) 

は、それが

+1

誰かが 'eval(parse())'を使うことは絶対に勧められません。ほとんどの場合、Rのようなやり方があります。これは本当に最後の手段に過ぎないはずです。 – MrFlick

+0

それは働いて、感謝vasanthcullen ... @Mrflickは、特定の理由は、 'eval(解析)()'を避ける必要がありますか? – Ell

+0

@ rg255このトピックについては、http:// stackoverflowを参照します。com/questions/13649979/what-specific-are-the-dangers-of-evalparse – MrFlick

関連する問題