使用 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
起作用。
总而言之,我如何将 purrr
和 ecdf
一起使用,以便它 returns 一个向量 a 百分位数(即将 raw_val
与 airquality$Temp
进行比较通过 airquality$Month
?
您需要将 Temp
列而不是整个数据集传递给 ecdf
。此外,如果您使用 map2_dbl
而不是 map2
,您可以获得非列表列作为输出。
在 mutate
中你可以使用:
map2_dbl(data, raw_val, ~ecdf(.x$Temp)(.y))
我正在尝试创建一个 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
起作用。
总而言之,我如何将 purrr
和 ecdf
一起使用,以便它 returns 一个向量 a 百分位数(即将 raw_val
与 airquality$Temp
进行比较通过 airquality$Month
?
您需要将 Temp
列而不是整个数据集传递给 ecdf
。此外,如果您使用 map2_dbl
而不是 map2
,您可以获得非列表列作为输出。
在 mutate
中你可以使用:
map2_dbl(data, raw_val, ~ecdf(.x$Temp)(.y))