我正在尝试创建一个 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 能够工作。
总而言之,如何将 purrr
和 ecdf
一起使用,以便它返回一个百分位数的向量(即将 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/