首页 > 解决方案 > 将 predict() 与 lapply 中的特定值向量一起用于 data.frames 列表

问题描述

我正在努力实现以下目标。我有一个数据框列表,格式如下:

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都将用于每个模型。

我怎样才能解决这个问题?

标签: r

解决方案


“list1”中各个 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“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

推荐阅读