我正在努力实现以下目标。我有以下形式的数据框列表:
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
中的所有值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
中的所有值都将用于每个模型。
我该如何解决这个问题?
答案 0 :(得分:1)
&#34; list1&#34;中各个data.frames的名称是列名,而不是该列表项的总名称。要查看此内容,请运行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
&#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