【问题标题】:Finding observation percentile realtive to a distribution with purrr - R使用 purrr - R 查找相对于分布的观察百分位数
【发布时间】: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 可以工作。

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

【问题讨论】:

  • 你需要得到data$Tempecdf。试试map2_dbl(data, raw_val, ~ecdf(.x$Temp)(.y))
  • @aosmith 这确实有效。如果你想做一个答案,我会回答。快到了!

标签: r dplyr tidyverse purrr


【解决方案1】:

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

mutate 你可以使用:

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

【讨论】:

    猜你喜欢
    • 2018-11-11
    • 2020-04-15
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 2017-03-30
    • 2020-03-19
    • 1970-01-01
    相关资源
    最近更新 更多