【发布时间】:2017-07-28 17:20:28
【问题描述】:
我正在尝试创建一个 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 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 是列表列的第一个元素,并返回一个整数向量。但是当我尝试map 时,我似乎无法弄清楚如何将它强制转换为原始整数分布,以便ecdf 可以工作。
总而言之,我如何将purrr 和ecdf 一起使用,以便它返回一个向量a 百分位数(即通过airquality$Month 比较raw_val 和airquality$Temp?
【问题讨论】:
-
你需要得到
data$Temp的ecdf。试试map2_dbl(data, raw_val, ~ecdf(.x$Temp)(.y)) -
@aosmith 这确实有效。如果你想做一个答案,我会回答。快到了!