基于rsample与purrr实现嵌套CV数据框多映射并新增列
搞定嵌套交叉验证数据集的批量处理需求
我来帮你实现遍历所有嵌套交叉验证数据集、提取分析集并新增列的操作,用purrr的嵌套map就能轻松搞定,步骤如下:
核心思路
你的cv_rolling里的inner_resamples是嵌套结构:外层是每个Resample对应的tibble,每个tibble里又有splits列(存的是rsample的split对象)。我们需要两层嵌套遍历:
- 外层遍历每个Resample对应的inner tibble
- 内层遍历每个inner tibble里的split对象,提取分析数据集并新增
NEWCOL列 - 最后把处理后的结构放回原数据框,完成覆盖
完整代码实现
假设你已经加载了tidyverse、rsample这些依赖包,直接运行下面的代码即可:
# 遍历所有inner_resamples元素,处理每个子数据集并覆盖原结构 cv_rolling$inner_resamples <- map(cv_rolling$inner_resamples, function(inner_tbl) { # 对当前inner_tbl的splits列逐个处理:提取分析集 + 新增NEWCOL inner_tbl %>% mutate( # 替换这里的NEWCOL计算逻辑为你的实际需求 processed_analysis = map(splits, ~ analysis(.x) %>% mutate(NEWCOL = 8677 + row_number() * 80)) ) # 如果需要替换掉原来的splits列,改成下面这行: # inner_tbl %>% mutate(splits = map(splits, ~ analysis(.x) %>% mutate(NEWCOL = 8677 + row_number() * 80))) })
代码说明
- 外层
map:遍历cv_rolling$inner_resamples里的每一个Resample对应的tibble - 内层
map(splits, ...):针对每个split对象,用analysis()提取用于模型训练的分析数据集,再通过mutate()新增NEWCOL列 - 你可以根据实际需求修改
NEWCOL的计算逻辑,比如换成基于现有列的公式(比如NEWCOL = Value * 10 + out),示例里的8677 + row_number()*80只是模仿你给出的示例输出
验证结果
运行完代码后,你可以查看第一个Resample的处理结果:
# 查看第一个Resample的处理后数据 cv_rolling$inner_resamples[[1]]
每个行的processed_analysis列(或替换后的splits列)里都会是带NEWCOL的数据集,和你给出的示例输出结构一致。
内容的提问来源于stack exchange,提问作者user113156
相关产品推荐
相关产品推荐

