r - 使用 purrr - R 查找相对于分布的观察百分位

标签 r dplyr tidyverse purrr

我正在尝试创建一个 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,我觉得必须有一种方法可以为每个执行此操作,并将结果添加到上面的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 是列表列的第一个元素,并返回整数向量。但是,当我尝试映射它时,我似乎无法弄清楚如何将其强制转换为原始整数分布,以便 ecdf 能够工作。

总而言之,如何将 purrrecdf 一起使用,以便它返回一个百分位数的向量(即将 raw_val >airquality$Temp by airquality$Month

最佳答案

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

mutate中你可以使用:

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

关于r - 使用 purrr - R 查找相对于分布的观察百分位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45379138/

相关文章:

r - 使用不同长度的向量与 tidyr 分开

r - 如何过滤任何列中的非零行

r - 如何按顺序编码多列并删除 tidyverse 中的重复数据

r - 在 R 中分配自定义周数

r - 将数据帧列表传递到循环中以同时组合和更改标题

r - 为什么 dplyr 的过滤器会从因子变量中删除 NA 值?

r - 在 map 函数中迭代应用 ggplot 函数

r - 用不同的变量值给每个面着色

r - 具体用 R 删除所有重复项

r - 使用dplyr(或其他方式)将包含列表的数据框列拆分为多个列