gpt4 book ai didi

r - 使用 dplyr 的数据框中的频率加权百分位数

转载 作者:行者123 更新时间:2023-12-04 15:25:08 24 4
gpt4 key购买 nike

我正在尝试计算数据框中某个值的百分位数排名,而且我在数据框中也有一个相关频率作为权重依据。我正在努力想出一个解决方案来计算原始值的百分位数,就好像整体分布是由频率复制的值和由该频率复制的所有其他值一样。

例如:

groceries <- tribble(
~item, ~price, ~freq,
"apple", 1, 20,
"banana", 2, 5,
"carrot", 3, 1
)

groceries %>%
mutate(reg_ptile = percent_rank(price),
wtd_ptile = weighted_percent_rank(price, wt = freq))

# the expected result would be:

# A tibble: 3 x 5
item price freq reg_ptile wtd_ptile
<chr> <dbl> <dbl> <dbl> <dbl>
1 apple 1 20 0.0 0.0
2 banana 2 5 0.5 0.8
3 carrot 3 1 1.0 1.0

percent_rank() 是一个实际的 dplyr 函数。函数 weighted_percent_rank() 应该怎么写?不确定如何在数据框和管道中进行这项工作。如果该解决方案也适用于团体,那就太棒了。

编辑:使用 uncount() 实际上不起作用,因为不计算我正在使用的数据会产生 8000 亿行。还有其他想法吗?

最佳答案

您可以使用 tidyr::uncount 根据频率扩展行数以获得加权百分位数,然后使用 summarize 减少它们,按照这个正则表达式:

library(dplyr)

groceries <- tribble(
~item, ~price, ~freq,
"apple", 1, 10,
"banana", 2, 5,
"carrot", 3, 1
)

groceries %>%
tidyr::uncount(freq) %>%
mutate(wtd_ptile = percent_rank(price)) %>%
group_by(item) %>%
summarize_all(~.[1]) %>%
mutate(ptile = percent_rank(price))
#> # A tibble: 3 x 4
#> item price wtd_ptile ptile
#> <chr> <dbl> <dbl> <dbl>
#> 1 apple 1 0 0
#> 2 banana 2 0.667 0.5
#> 3 carrot 3 1 1

请注意,您可以选择不同的排名函数,但在本例中加权百分位数是 0.667(10/(16 - 1)),而不是 0.8


编辑

不涉及创建数十亿行的替代方案:

groceries %>% 
arrange(price) %>%
mutate(wtd_ptile = lag(cumsum(freq), default = 0)/(sum(freq) - 1))
#> # A tibble: 3 x 4
#> item price freq wtd_ptile
#> <chr> <dbl> <dbl> <dbl>
#> 1 apple 1 10 0
#> 2 banana 2 5 0.667
#> 3 carrot 3 1 1

关于r - 使用 dplyr 的数据框中的频率加权百分位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62439652/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com