Используйте строку, чтобы выбрать местоположение во фрейме данных, чтобы сохранить значение - PullRequest
1 голос
/ 24 апреля 2020

У меня есть все oop, которое проходит через модели. L oop генерирует несколько формул, которые вставляются в команду модели и затем обрабатываются для выбора шага назад, используя buildmer(). Используя функцию lapply(), он делает это для каждого фрейма данных в списке под названием «Виды». Проблема в том, что мне нужно хранить результаты в разных фреймах данных, чтобы не перепутать их.

Упрощенный пример кода:

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(), для которого полное имя столбца уникально в каждом фрейме данных. Поэтому я подумал, что могу назвать каждый фрейм данных этой строкой, то есть «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)

1 Ответ

0 голосов
/ 25 апреля 2020

Хранение фреймов данных в виде списка позволило мне назвать каждый фрейм данных в списке следующим образом:

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)
...