Различные переменные длины при цикле по строковому вектору, который соответствует столбцам фрейма данных - PullRequest
0 голосов
/ 18 декабря 2018

Я новичок в написании циклов, и у меня есть некоторые трудности там.Я уже просмотрел другие вопросы, но не нашел ответа на свою конкретную проблему.

Итак, давайте просто создадим случайный набор данных, дадим имена столбцов и зададим переменные в виде символов:

d<-data.frame(replicate(4,sample(1:9,197,rep=TRUE)))
colnames(d)<-c("variable1","variable2","trait1","trait2")
d$variable1<-as.character(d$variable1)
d$variable2<-as.character(d$variable2)

Теперь я определяю свой вектор, по которому я хочу выполнить цикл.Это соответствует черте 1 и черте 2:

trt.nm <- names(d[c(3,4)]) 

Теперь я хочу применить следующую модель для черты 1 и черты 2 (которые теперь должны быть именами столбцов в trt.nm) в цикле:

library(lme4)
for(trait in trt.nm)
{
  lmer (trait ~ 1 + variable1 + (1|variable2) ,data=d)
}

Теперь я получаю ошибку, что переменные длины отличаются.Как это можно объяснить?

Если я применяю модель без цикла для каждой черты, я получаю результат, поэтому проблема должна быть где-то в цикле, я думаю.

1 Ответ

0 голосов
/ 18 декабря 2018

trait - строка, поэтому вам придется преобразовать ее в формулу для работы;см. http://www.cookbook -r.com / Формулы / Создание_a_formula_from_a_string / для получения дополнительной информации.

Попробуйте это (вам нужно добавить оператор печати или сохранить результат, чтобы увидеть, что он делает, но он будет работать без ошибок):

for(trait in trt.nm) {
  lmer(as.formula(paste(trait, " ~ 1 + variable1 + (1|variable2)")), data = d)
}

Другое предложение будетиспользовать список и lapply или purrr::map вместо этого.Удачи!

...