【发布时间】:2014-11-26 21:08:14
【问题描述】:
给定一个包含 72 个元素(dataset_1、dataset_2 等)的列表(list.data.partitions),每个元素包含两个子元素(2 个数据帧):$training 和 $testing;例如:
> str(list.data.partitions$dataset_1)
List of 2
$ training:'data.frame': 81 obs. of 20 variables:
..$ b0 : num [1:81] 11.61 9.47 10.61 7.34 12.65 ...
..$ b1 : num [1:81] 11.6 9.94 10.7 10.11 12.2 ...
..$ b2 : num [1:81] 34.2 31 32.7 27.9 36.1 ...
...
..$ index: num [1:81] 0.165 0.276 0.276 0.181 0.201 ...
$ testing :'data.frame': 19 obs. of 20 variables:
..$ b0 : num [1:19] 6.05 12.4 13.99 16.82 8.8 ...
..$ b1 : num [1:19] 12.4 10.8 11.8 13.7 16.3 ...
..$ b2 : num [1:19] 25.4 29.8 31.2 34.1 27.3 ...
...
..$ index: num [1:19] 0.143 1.114 0.201 0.529 1.327 ...
如何使用 lapply(或类似功能)和插入符号的 predict 函数正确访问 $testing 数据框:
fun.predict.rf <- function(x, y) {
predict(x, newdata = y$testing)
}
list.predictions <- lapply(list.models, fun.predict.rf, y=list.data.partitions)
上述函数“有效”,但它返回基于$training 数据帧(~80 obs)的预测,而不是指定的$testing 数据帧(~20 obs)。最终,我希望一个列表包含我列表中每个元素的预测,基于 $testing 数据框。
list.models 是基于 $training 数据框的 72 个模型的列表,使用 R 中的 caret 包(未显示或包含)。在考虑单个子元素($training 或 $testing)时,list.models 中的模型数 (72) 等于 list.data.partitions 中的元素数 (72)。 list.data.partitions 中 72 个元素的名称各不相同:dataset_1、dataset_2 等,但结构相同(参见上面的 str 输出)。
list.data.partitions可以下载here。在这个版本中,这 72 个元素没有名称,但在我的版本中,这 72 个元素被命名(例如,dataset_1、dataset_2 等)。每个子元素仍然命名为$training 和$testing。
【问题讨论】:
-
你的电话不需要
y=list.data.partitions$dataset_1而不是y=list.data.partitions吗?这就是为什么它不起作用。我无法从该文件中提取数据,顺便说一句 -
我知道你在做什么,但是如果我将
y=list.data.partitions$dataset_1硬编码到调用中,那么model.list中的 72 个模型中的每一个都会调用该特定数据集,而我想要每个要在每个元素的$testing数据帧上运行的模型。list.data.partitions$[each of the 72 elements]$testing之类的东西是我想要的,但我找不到正确的语法。我使用save(list.data.partitions, file = "/file/path")来保存对象,所以它可能必须加载到 R 中。 -
我改变了我的答案。我想现在会更好
-
我可能错了,但这里似乎最简单的解决方案是使用
mapply。如果您将函数调用更改为:list.predictions <- mapply(fun.predict.rf, list.models, list.data.partitions),我认为您应该会得到想要的结果。 -
@Cotton.Rockwood - 呃……该死的。这很有效,而且很简单。你能写出这个答案以及为什么它比使用 lapply 有效吗?