我使用嵌套循环在R中执行MCMCglmm的多次运行,将后验分布输出到数据帧中。外循环执行MCMC过程,生成后验分布,然后内循环将其中的每一个提升到单独的数据框中(其中 F 是每次运行的固定效果中的后验分布数)链, n 是要执行的随机数);因此,会有 F (在本例中为4个)数据帧,每个数据帧都有 n 列。
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()
和$<-
的解决方案。花了三天时间试图解决这个问题,我转向这个社区。 p>
如何将矢量分配给特定的列和特定的数据帧,这两个数据帧同时在内部嵌套循环中指定?
&#34;目标:将向量
Fj
(或A)放入数据框i
的{{1}}列
答案 0 :(得分:1)
这里只是通过使用相同的两个for循环将A的值分配到dataframe 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")))
}
}
修改:要与问题更相关,请使用
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")))
}
如果有帮助请告诉我