r - dplyr - 将分组变量与分组变量的子集进行比较

标签 r group-by dplyr

假设我有一个长格式的购买表。它看起来像:

purchases = data.frame(
    Item = c("Bike", "Bike", "Bike", "Bike", "Car", "Car", "Car", "Car"),
    Variable = c("Age", "Age", "Price", "Price", "Age", "Age", "Price", "Price"),
    Value = c("New", "Used", "Full", "Discount", "New", "Used", "Discount", "Discount")
)

我想查看按项目和变量分组的值的分布。所以我可以说“在所有售出的自行车中,50% 已被使用”或“所有汽车均以折扣价出售。”

理想的输出将是一个如下所示的表格:

enter image description here

我可以通过执行以下操作来获取 dplyr 中的计数:

purchases %>% group_by(Item, Variable, Value) %>%
    summarise(Total = n())

然后,我将每个值除以它们各自的项目和变量分组。我可以想到一些长答案,其中我有条件地在另一个变量中添加相应的计数,但我希望找到一种简单的方法来通过 dplyr 来做到这一点。另一种描述方式可能是在分组的上一级执行计算。

最佳答案

library(tidyverse)
purchases %>%
  count(Item, Variable, Value) %>%
  group_by(Item, Variable) %>%
  mutate(pct = n / sum(n)) %>%
  ungroup()

# A tibble: 7 x 5
  Item  Variable Value        n     pct
  <fct> <fct>    <fct>    <int>   <dbl>
1 Bike  Age      New          1     0.5
2 Bike  Age      Used         1     0.5
3 Bike  Price    Discount     1     0.5
4 Bike  Price    Full         1     0.5
5 Car   Age      New          1     0.5
6 Car   Age      Used         1     0.5
7 Car   Price    Discount     2     1 

关于r - dplyr - 将分组变量与分组变量的子集进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58527988/

相关文章:

MySQL SELECT 按组最频繁

mysql - 为什么在MYSQL中使用GROUP BY时DISTINCT显示的结果不一样

r - 在没有循环的情况下找到时间序列中最大的下降/上升(最好使用 tidy/dplyr)?

r - 根据名称有条件地乘以值

r - 如何在R中将一列的元素与group_by相交

r - 使用:= and = in ggvis property assignments

r - 当ggplotly与facet_wrap一起使用时,仅出现第一个facet的数据

php - 如何在 MySQL 中选择 TOP n 分组值的 AVG?

r - 如何滚动应用多列数据表

r - 传递标签以选择和返回服务器功能的值