【问题标题】:Purrr and mapping vector-output functionsPurrr 和映射向量输出函数
【发布时间】:2019-02-19 14:02:21
【问题描述】:

我正在努力解决purrr 的问题,但我正在努力解决应该很容易的事情。

假设我有以下男性和女性的数据

n <- 1000
toydata <- data.frame(
  sex = as.character(ifelse(rnorm(n)>0, "M", "F")),
  value = rnorm(n)
)

现在,我要计算值列的以下五个分位数

p <- c(.1, .25, .5, .75, .9)

当我使用 quantile 函数进行 mutate + map 时,返回的向量列表存储为附加列,正如预期的那样:

toydata %>%
  group_by(sex) %>%
  nest() %>%
  mutate(
    quantiles = map(data, ~quantile(.$value, p, na.rm=TRUE))
  )


# A tibble: 2 x 3
  sex   data               quantiles
  <fct> <list>             <list>   
1 F     <tibble [491 × 1]> <dbl [5]>
2 M     <tibble [509 × 1]> <dbl [5]>

将五个分位数存储为我的数据框的五个新列的优雅方法是什么?

【问题讨论】:

    标签: r dplyr purrr


    【解决方案1】:

    这是一种选择:

    toydata %>%
      group_by(sex) %>%
      nest() %>%
      crossing(p) %>%
      mutate(
        quantiles = map2_dbl(data, p, ~quantile(.x$value, .y, na.rm=TRUE)),
        p = paste0('quantile_', p)
      ) %>%
      spread(p, quantiles)
    

    第二个选项:

    toydata %>%
      group_by(sex) %>%
      nest() %>%
      mutate(
        quantiles = map_chr(data, ~quantile(.$value, p, na.rm=TRUE) %>% str_c(collapse = '_'))
      ) %>%
      separate(quantiles, paste0('quantile_', p), sep = '_') %>%
      mutate_at(vars(starts_with('quantile')), as.numeric)
    

    输出:

      sex   data               quantile_0.1 quantile_0.25 quantile_0.5 quantile_0.75 quantile_0.9
      <fct> <list>                    <dbl>         <dbl>        <dbl>         <dbl>        <dbl>
    1 F     <tibble [512 x 1]>        -1.31        -0.758       0.0400         0.623         1.32
    2 M     <tibble [488 x 1]>        -1.37        -0.795      -0.178          0.603         1.25
    

    【讨论】:

    • 这正是我想要的,而且很漂亮。看起来purrr 总是希望数据格式尽可能长...谢谢!
    • 顺便说一句,当数据集很大时,第二个选项看起来效率更高,因为它不需要交叉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 2019-04-09
    相关资源
    最近更新 更多