使用 purrr - R 查找分布的观察百分位数 realtive

Finding observation percentile realtive to a distribution with purrr - R

我正在尝试创建一个 dplyr 管道,它将一个值与一个分布进行比较,returns 该值相对于该分布的百分位数。假设我有这个 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 tibble。这是我尝试过的:

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 是列表列的第一个元素,returns 是整数向量。但是当我尝试 map 时,我似乎无法弄清楚如何将其强制转换为原始整数分布,以便 ecdf 起作用。

总而言之,我如何将 purrrecdf 一起使用,以便它 returns 一个向量 a 百分位数(即将 raw_valairquality$Temp 进行比较通过 airquality$Month?

您需要将 Temp 列而不是整个数据集传递给 ecdf。此外,如果您使用 map2_dbl 而不是 map2,您可以获得非列表列作为输出。

mutate 中你可以使用:

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