Purrr和映射向量输出功能

时间:2019-02-19 14:02:22

标签: r dplyr purrr

我正在努力争取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)

当我使用分位数功能对+进行变异+映射时,向量列表将按预期方式存储为其他列:

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]>

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

1 个答案:

答案 0 :(得分:1)

这是一个选择:

composer dumpautoload

第二个选项:

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)