首页 > 解决方案 > R子集内部级别嵌套数据框

问题描述

在使用 rsample、tidymodels 时,我使用以下代码创建了重新采样(见下文)。虽然我不想评估具有所有水平位置的模型,但在本例中从 1 到 5。假设我只想评估 4 和 5 水平位置的模型。我现实生活中的问题有点像这样。所以我不希望我的模型在所有水平位置都出现错误。

所以我的选择是使用 rsample::rolling_origin() 然后子集评估索引。我可以用 for 循环来做到这一点......但我对使用另一种方式感到好奇。我想用 purrr 来做。我知道我可能应该移动一个,因为它的工作原理是这样的……但这让我很生气。

如何使用 purrr 的函数引用第三个内部级别?

require(tidyverse)
require(tidymodels)

data(cars)

roll_rs <-rolling_origin(
data=cars,
initial = floor(0.80*(nrow(cars))),
assess = 5,
skip = 0,
cumulative = TRUE )

new_roll_rs<-roll_rs

for (i in 1:13){
new_roll_rs[[1]][[i]][["out_id"]]<-roll_rs[[1]][[i]][["out_id"]][4:5]
}

谢谢

标签: rlistsubsetpurrrtidymodels

解决方案


当我想了解一些更深层次的东西时,我经常map()不止一次:

library(tidymodels)
#> ── Attaching packages ──────────────────────────────────────────────── tidymodels 0.1.1 ──
#> ✓ broom     0.7.0      ✓ recipes   0.1.13
#> ✓ dials     0.0.8      ✓ rsample   0.0.7 
#> ✓ dplyr     1.0.0      ✓ tibble    3.0.3 
#> ✓ ggplot2   3.3.2      ✓ tidyr     1.1.0 
#> ✓ infer     0.5.3      ✓ tune      0.1.1 
#> ✓ modeldata 0.0.2      ✓ workflows 0.1.2 
#> ✓ parsnip   0.1.2      ✓ yardstick 0.0.7 
#> ✓ purrr     0.3.4
#> ── Conflicts ─────────────────────────────────────────────────── tidymodels_conflicts() ──
#> x purrr::discard() masks scales::discard()
#> x dplyr::filter()  masks stats::filter()
#> x dplyr::lag()     masks stats::lag()
#> x recipes::step()  masks stats::step()

data(cars)

roll_rs <- rolling_origin(
  data = cars,
  initial = floor(0.80*(nrow(cars))),
  assess = 5,
  skip = 0,
  cumulative = TRUE
)

roll_rs$splits %>% 
  map("out_id") %>% 
  map(magrittr::extract, c(4, 5))
#> [[1]]
#> [1] 44 45
#> 
#> [[2]]
#> [1] 45 46
#> 
#> [[3]]
#> [1] 46 47
#> 
#> [[4]]
#> [1] 47 48
#> 
#> [[5]]
#> [1] 48 49
#> 
#> [[6]]
#> [1] 49 50

reprex 包(v0.3.0.9001)于 2020 年 7 月 21 日创建

第一个map()提取"out_id",然后第二个提取这些 IDmap()extract()第四个和第五个元素。


推荐阅读