首页 > 解决方案 > 嵌套分类变量,引导程序,然后在 R 中提取中位数

问题描述

我在看似简单的解决方案上遇到了麻烦。我有一个数据框,locations每个位置都有一个value与之关联的。我按位置嵌套了 data.frame,然后使用purrr(见下文)引导值。

library(tidyverse)
library(modelr)
library(purrr)

locations <- c("grave","pinkham","lower pinkham", "meadow", "dodge", "young")

values <- rnorm(n = 100, mean = 3, sd = .5)
df <- data.frame(df)

df.boot <- df %>% 
  nest(-locations) %>% 
  mutate(boot = map(data,~bootstrap(.,n=100, id = "values")))

现在我试图从最终列表中的每个引导程序中获取中位数df.boot$boot,但似乎无法弄清楚?我尝试过申请map(boot, median),但我越深入挖掘越没有意义。boot列表中想要的向量是idx我可以从中获取中值然后存储它(几乎是boot函数所做的,但通过唯一的分类变量迭代)。任何帮助将非常感激。我可能只是走错路了……

标签: rnested-listspurrrresampling

解决方案


如果我们需要提取median

library(dplyr)
library(purrr)
library(modelr)
out <- df %>%
         group_by(locations) %>% 
         nest %>% 
         mutate(boot = map(data, ~ bootstrap(.x, n = 100, id = 'values') %>%
                                 pull('strap') %>% 
                                 map_dbl(~ as_tibble(.x) %>% 
                                          pull('values') %>%
                                          median)))
out
# A tibble: 6 x 3
# Groups:   locations [6]
#  locations     data              boot       
#  <fct>         <list>            <list>     
#1 pinkham       <tibble [12 × 1]> <dbl [100]>
#2 lower pinkham <tibble [17 × 1]> <dbl [100]>
#3 meadow        <tibble [16 × 1]> <dbl [100]>
#4 dodge         <tibble [22 × 1]> <dbl [100]>
#5 grave         <tibble [21 × 1]> <dbl [100]>
#6 young         <tibble [12 × 1]> <dbl [100]>

数据

df <- data.frame(values, locations = sample(locations, 100, replace = TRUE))

推荐阅读