Нахождение процентиля наблюдения, соответствующего распределению с мурлыканьем - R

Я пытаюсь создать канал 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?


person boshek    schedule 28.07.2017    source источник
comment
Вам нужно получить ecdf из data$Temp. Попробуйте map2_dbl(data, raw_val, ~ecdf(.x$Temp)(.y))   -  person aosmith    schedule 28.07.2017
comment
@aosmith Это точно сработало. Если хотите, как ответ, я отвечу. Почти было!   -  person boshek    schedule 28.07.2017


Ответы (1)


Вы захотите передать столбец Temp в ecdf вместо всего набора данных. Также, если вы используете map2_dbl вместо map2, вы можете получить в качестве вывода столбец, не входящий в список.

В mutate вы можете использовать:

map2_dbl(data, raw_val, ~ecdf(.x$Temp)(.y))

person aosmith    schedule 28.07.2017