r - 将 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
都将用于每个模型。
我怎样才能解决这个问题?
解决方案
“list1”中各个 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
“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
推荐阅读
- javascript - 为什么将名为 values 的变量声明为对象会在 Firefox 中返回函数类型
- python - 如何在tensorflow中将hsv张量更改为rgb张量?
- angular - Angular 6 select:设置初始值
- spring - 查询DSL截断日期
- amazon-web-services - 如何在 serverless.yml 的单个条目中指定多个资源?
- c# - 将Word文档转换为HTML而不丢失原始文件
- java - RecyclerView 一开始只显示一个项目,然后只显示三个
- python - 创建我们自己的信号来中断 Python 程序
- spring-data-jpa - 在加载父实体时对子实体应用 JPA 规范
- python - 多个复选框一个提交按钮以多种形式