Я пытаюсь создать канал dplyr, который сравнивает значение с распределением и возвращает процентиль этого значения относительно этого распределения. Скажем, у меня есть tibble
со списком столбцов:
library(tidyverse)
raw_val <- c(75,66, 80, 92, 91)
aq_nest <- airquality %>%
select(Temp, Month) %>%
group_by(Month) %>%
nest(Temp) %>%
mutate(raw_val = raw_val)
> aq_nest
# A tibble: 5 x 3
Month data raw_val
<int> <list> <dbl>
1 5 <tibble [31 x 1]> 75
2 6 <tibble [30 x 1]> 66
3 7 <tibble [31 x 1]> 80
4 8 <tibble [31 x 1]> 92
5 9 <tibble [30 x 1]> 91
Теперь я могу найти то, что мне нужно для одного значения Month
:
> ecdf(aq_nest$data[[1]]$Temp)(raw_val[1])
[1] 0.9032258
Таким образом, 75 соответствует примерно 90-му процентилю.
Но с purrr
я чувствую, что должен быть способ сделать это для каждого Month
и добавить результат в aq_nest
таблицу выше. Вот что я пробовал:
aq_nest <- airquality %>%
select(Temp, Month) %>%
group_by(Month) %>%
nest(Temp) %>%
mutate(raw_val = raw_val) %>%
mutate(Percentile = map2(data, raw_val, ~ecdf(.x)(.y)))
Что приводит к этой ошибке:
Error in mutate_impl(.data, dots) :
Evaluation error: Can't use matrix or array for column indexing.
Так что это выдает мое непонимание с purrr
. Этот aq_nest$data[[1]]$Temp
является первым элементом столбца списка и возвращает вектор целых чисел. Но когда я пытаюсь map
это, я не могу понять, как принудить его к этому необработанному целочисленному распределению, чтобы ecdf
работал.
Подводя итог, как я могу использовать purrr
и ecdf
вместе, чтобы он возвращал вектор a процентили (то есть сравнивая raw_val
с airquality$Temp
на airquality$Month
?
ecdf
изdata$Temp
. Попробуйтеmap2_dbl(data, raw_val, ~ecdf(.x$Temp)(.y))
- person aosmith   schedule 28.07.2017