dplyr - сравнить сгруппированные переменные с подмножеством сгруппированных переменных - PullRequest
2 голосов
/ 23 октября 2019

Допустим, у меня есть таблица покупок в длинном формате. Это выглядит примерно так:

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. Другой способ описать это может быть выполнение вычислений на один уровень вверх по группировке.

1 Ответ

2 голосов
/ 23 октября 2019
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 
...