Использование предиката () с вектором определенных значений в lapply для списка data.frames - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь добиться следующего.У меня есть список фреймов данных в виде:

list1 <- list(d1=data.frame(name=rep("d1",3), A=c(1,2,3), B=c(2,4,5)),
              d2=data.frame(name=rep("d2",3), A=c(1,2,3), B=c(2,4,5)),
              d3=data.frame(name=rep("d3",3), A=c(1,2,3), B=c(2,4,5)))

Для каждого фрейма данных в list1 я хочу разместить линейную модель, а затем использовать эту модель для predict().Значения, используемые для прогнозов, находятся в отдельном кадре данных:

new.values <- data.frame(name=c("d1","d2","d3"), B=c(3,4,5))

Каждая модель должна использоваться только с одним значением из new.values, с соответствующим именем (например, для list$d1 значение вnew.values[new.values$name == d1, ]), не для всех значений в new.values$B Я пробовал это:

predictions <- lapply(list1, function(x) predict(lm(A~B, data=x), new.values[new.values$name == names(x),], interval="predict")) 

Но прогнозы остаются пустыми:

> predictions
$d1
     fit lwr upr

$d2
     fit lwr upr

$d3
     fit lwr upr

Я думаю, потому что R не находит никаких значений дляпредсказать.Если я запускаю

predictions <- lapply(list1, function(x) predict(lm(A~B, data=x), new.values, interval="predict"))  

, все значения в new.values будут использоваться для каждой модели.

Как я могу это исправить?

1 Ответ

0 голосов
/ 31 мая 2018

Имена отдельных data.frames в «list1» - это имена столбцов, а не общее имя этого элемента списка.Чтобы увидеть это, запустите names(list1[[1]]).

names(list1[[1]])
"name" "A"    "B"  

Если вы хотите циклически проходить по списку и по именам списка одновременно, тогда полезно purrr::imap().

Для анонимной функции потребуются два аргумента, которые я вызываю xи y, чтобы обращаться к списку и именам списка соответственно.

library(purrr)
imap(list1, function(x, y) predict(lm(A~B, data=x), new.values[new.values$name == y,], 
                                   interval="predict")) 
$d1
       fit      lwr      upr
1 1.571429 -2.48742 5.630277

$d2
       fit      lwr      upr
2 2.214286 -1.74179 6.170362

$d3
       fit       lwr      upr
3 2.857143 -1.589103 7.303388

Если ваши значения прогнозирования также сохраняются в списке, purrr::map2() будет полезно для одновременного просмотра двух списков.

Чтобы показать это, я split добавлю объект "new.values" в список.Затем я могу перебрать два списка (одинаковой длины) через map2().Я использую здесь формулу записи, где .x относится к первому списку, а .y ко второму вместо написания анонимной функции.

new.val.list = split(new.values, new.values$name)
map2(list1, new.val.list, ~predict(lm(A~B, data=.x), .y, 
                                 interval="predict"))
$d1
       fit      lwr      upr
1 1.571429 -2.48742 5.630277

$d2
       fit      lwr      upr
2 2.214286 -1.74179 6.170362

$d3
       fit       lwr      upr
3 2.857143 -1.589103 7.303388
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...