dplyr 按具有多个阈值的组对行进行子集

dplyr Subsetting rows by groups with multiple thresholds

提问人:Olaf Odinn 提问时间:9/20/2023 最后编辑:user438383Olaf Odinn 更新时间:9/20/2023 访问量:25

问:

我目前正在尝试回答一个相当简单的问题:列出每个地区排名前 20% 的药店(以单位衡量)。

我首先测量了每家药房销售的产品数量,对其进行了 DESC 排序,并有以下 20% 的阈值:

以下是我计算数字的方式:

spad_number <- c_spad_results %>%
  group_by(province)%>%
  summarise(tot_pharma = n())
View(spad_number)

spad_number_20_threshold <- spad_number %>%
  mutate(Top_20_threshold = round(tot_pharma*0.20))%>%
  dplyr::select(Top_20_threshold,province)

给我这个结果数据帧

花絮:4×2 Top_20_threshold省
1 248 柏林 2 38 热那亚
3 27 伦敦
4 42 都灵

现在我想得到一个数据帧,我只得到前 20%,想不出比这更好的解决方案:

top_20_pharma <- ranked_pharmas %>%
  group_by(province) %>%
  slice(1:spad_number_20_threshold$Top_20_threshold)
View(top_20_pharma)

并得到我不断遇到的问题

警告消息: 1:1:spad_number_20_threshold$Top_20_threshold : 数值表达式有 4 个元素:仅使用第一个元素 2: In 1:spad_number_20_threshold$Top_20_threshold : 数值表达式有 4 个元素:仅使用第一个元素 3: 以 1:spad_number_20_threshold$Top_20_threshold 为单位: 数值表达式有 4 个元素:仅使用第一个元素 4: In 1:spad_number_20_threshold$Top_20_threshold : 数值表达式有 4 个元素:仅使用第一个元素

如何确保根据每个区域正确选择我的ranked_pharmas数据帧行,而不仅仅是读取数据帧的第一个值。

非常感谢您的任何帮助!!

最佳:)

我本来以为会得到 248 家柏林、38 家热那亚、27 家伦敦和 42 家药店,但超过了双倍。 我已经尝试了过滤器功能

#filter(row_number(desc(total_units)) <= first(spad_number_20_threshold$Top_20_threshold))

但它也只读取第一个值 248,每组给出 248 个药房。这里缺少像 excel 的 Vlookup 这样的东西,但我对 R 没有足够的经验:/

r dplyr 分组 切片

评论

0赞 Mark 9/21/2023
嗨,奥拉夫!欢迎来到 StackOverflow。请编辑您的问题以包含 dput(head(c_spad_results)) 的输出。非常感谢!

答:

0赞 Near Lin 9/20/2023 #1

不确定c_spad_results的结构,但我相信如果数据集排列好,可能会解决您的问题。slice_head

c_spad_results |>
  group_by(province) |>
  slice_head(prop = 0.2)