2016-05-12 56 views
1

我使用嵌套循環在R中執行MCMCglmm的多次運行,將後驗分佈輸出到數據框中。外部循環執行MCMC過程,生成後驗分佈,然後內部循環將其中的每一個提升爲單獨的數據框(其中F是鏈的每個運行的固定效果中的後驗分佈的數量,並且n是要執行的隨機數);因此,將會有F(在這種情況下,4個)數據幀,每個數據幀具有n列。將數據添加到R中的變量數據幀的變量列for循環

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()$<-的解決方案。花了三天的時間試圖自己解決這個問題,我轉向了這個社區。

如何一個分配一個矢量到特定柱和特定數據幀,這兩者的內部嵌套循環內同時指定?

「目的:通過使用相同的兩個獲得矢量Fj(或A)中i列數據幀的chainSolDF_j

+0

你是從'sapply' /'設計lapply'迴避了嗎?由於沒有並行性發生,這將是非常合適的。 –

+1

在編寫適當的R代碼時,很少使用'get()'或'assign()'。在指定列表中收集結果要好得多。這個例子太複雜了,不能提供完整的我們寫。簡化它會更好(特別是,它似乎與'MCMCglmm'沒有任何關係)。編輯你的問題來隔離和簡化你真正想要解決的問題。此外,該示例應該是[樣本輸入數據]的[reproducible](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example),以便我們也可以運行它。 – MrFlick

+0

@romanlustrik沒有理由,還沒有到轉換自己呢(需要真正花時間),我所做的大部分循環沒有足夠的計算強度,以使任何時間差異明智.. – Ell

回答

1

在這裏,這是剛剛分配的值轉換成數據幀chainSolDF_j的我列循環

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

編輯:更相關的問題,使用

eval(expr = parse(text = paste0("chainSolDF_", j, "[, ", i, "] <- A"))) 
在J for循環

,像

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

讓我知道這是否有助於

+1

我絕對不會建議有人使用'eval(parse())'。幾乎總是有更多類似R的方式來做事情。這真的只應該是最後的手段。 – MrFlick

+0

它的工作,感謝vasanthcullen ... @Mrflick是否有一個特定的原因,應該避免'eval(parse())'? – Ell

+0

@ rg255我會告訴你關於這個話題的這個問題:http:// stackoverflow。com/questions/13649979/what-specific-are-the-dangers-of-evalparse – MrFlick