我正在努力争取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]>
将五个分位数存储为数据帧的五个新列的优雅方式是什么?
答案 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)