对于data.frames列表,使用带有lapply特定值向量的predict()

时间:2018-05-30 21:45:54

标签: r

我正在努力实现以下目标。我有以下形式的数据框列表:

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$d1new.values[new.values$name == d1, ]的值),而不是new.values$B中的所有值1}} 我试过这个:

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 :(得分:1)

&#34; list1&#34;中各个data.frames的名称是列名,而不是该列表项的总名称。要查看此内容,请运行names(list1[[1]])

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

如果您想同时遍历列表和列表名称,那么purrr::imap()很有用。

匿名函数需要两个参数,我称之为xy,分别引用列表和列表名称。

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&#34; new.values&#34;将对象放入列表中。然后,我可以通过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