将数据添加到R for for

时间:2016-05-12 13:51:56

标签: r for-loop

我使用嵌套循环在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"))  
}

你可以看到一些(这只是&#34;突出显示&#34;)我尝试过的事情(#)以及他们生成的错误的描述 - 全部到徒劳无功!一般来说,我一直在寻找get()assign()$<-的解决方案。花了三天时间试图解决这个问题,我转向这个社区。

如何将矢量分配给特定的列和特定的数据帧,这两个数据帧同时在内部嵌套循环中指定?

  

&#34;目标:将向量Fj(或A)放入数据框i的{​​{1}}列

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

如果有帮助请告诉我