使用字符串到数据框中的 select 位置来存储值

Use string to select location in data frame to store value

我有一个贯穿模型的循环。循环生成多个公式,这些公式被插入到模型命令中,然后使用 buildmer() 进行处理以进行后退步骤选择。它使用 lapply() 函数为名为 Species 的列表中的每个数据框执行此操作。问题是我需要将结果存储在不同的数据框中,以免混淆它们。

代码的简化示例是:

lapply(Species, function(x){

  for (i in 1:10){
    LRm<-buildmer(formula = form.LR, family = 'binomial', control=glmerControl(optimizer="bobyqa"), data=x, crit= c('AIC'), direction = c("order", "backward"))


 #Get the species name for current model

  ID<-colnames(DIKDIK) %>%
  .[grepl("ADULTS",.)]%>%
  sub("*.ADULTS", "", .)

 paste0(ID)$AIC[i]<-AIC(LRm)

  }
})

编辑:form.LR 是为每次迭代重新创建的模型公式,但此代码被省略,因为它不相关

很明显,当代码达到 x 的第二个值(即 运行 第二个数据帧的模型)时,结果将被第一个结果覆盖,因为相同的索引因为 'i' 正在被使用。问题就出在这里。

请注意,我可以通过使用 grepl() 选择与 "ADULTS" 部分匹配的列名来识别使用了哪个数据框,其中完整列名在每个数据框中都是唯一的。所以我想我可以用这个字符串命名每个数据框,即 "GIRAFFE" 并用它来识别数据应该存储在哪里。但我似乎无法找到 paste() 的正确组合。而且我什至不确定我正在尝试的是否可行。

当前代码出现错误

Error in paste0(ID)[[i]] <- NA : could not find function "paste0<-"

到目前为止,我没有在 SO 上找到类似问题的任何其他解决方案。

物种列表对象的简化可重现示例是

ADULTS.GIRAFFE<-rnorm(20, 3, sd=1)
ADULTS.DIKDIK<-rnorm(20, 3, sd=1)
ADULTS.IMPALA<-rnorm(20, 3, sd=1)

presence1<-rbinom(20, 1, .5)
presence2<-rbinom(20, 1, .5)
presence3<-rbinom(20, 1, .5)

var1<-rnorm(20, 3, sd=1)
var2<-rnorm(20, 3, sd=1)
var3<-rnorm(20, 3, sd=1)

a<-cbind(presence1, var1, var2, var3, ADULTS.GIRAFFE)
b<-cbind(presence1, var1, var2, var3, ADULTS.DIKDIK)
c<-cbind(presence1, var1, var2, var3, ADULTS.IMPALA)

Species<-list(a,b,c)

将数据框存储为列表允许我将列表中的每个数据框命名为:

snames<-c("DIKDIK","THOMSONS", "GIRAFFE", "GRANTS", "IMPALA")

OutsLR<-lapply(snames, function(x){

  x<-data.frame()%>%
    insertRows(., 499, new = NA)%>%
    mutate(Number=NA)%>%
    mutate(AIC=NA)%>%
    mutate(Model=NA)

})

#Rename the data frames in the list
names(Outs) = snames

然后使用名为 ID 的字符串对象选择数据框就很容易了

#Just for the example
ID<-"DIKDIK"

#Then 
OutsLR[[ID]][["AIC"]][i]<-AIC(LRm)