Мурлыканье и отображение векторных функций вывода - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь разобраться с 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)

Когда я изменяю + 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]>

Каков элегантный способ хранения пяти квантилей в виде пяти новых столбцов моего фрейма данных?

1 Ответ

0 голосов
/ 19 февраля 2019

Это один из вариантов:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...