Сложная группа в R на нескольких столбцах - PullRequest
0 голосов
/ 29 июня 2018

У меня есть датафрейм с некоторыми данными о бейсболе, который выглядит следующим образом:

dput(pitchdata)
structure(list(stand = c("R", "R", "R", "R", "R", "L", "L", "L", 
"L", "L", "L", "L", "L", "L", "R", "R", "R", "R", "R", "R", "R", 
"L", "L", "R", "R", "R", "L", "L", "L", "L", "L", "R", "R", "R", 
"R", "R", "R", "R", "R", "L", "L", "L", "L", "L", "R", "R", "R", 
"R", "R", "L"), zone = c(12L, 3L, 5L, 14L, 1L, 6L, 12L, 11L, 
7L, 12L, 8L, 1L, 14L, 14L, 3L, 11L, 9L, 9L, 12L, 9L, 14L, 4L, 
4L, 2L, 4L, 11L, 11L, 11L, 5L, 13L, 14L, 3L, 5L, 5L, 12L, 5L, 
6L, 11L, 5L, 1L, 5L, 4L, 13L, 11L, 1L, 14L, 13L, 1L, 7L, 7L), 
    balls = c(0L, 0L, 1L, 0L, 0L, 3L, 3L, 2L, 2L, 2L, 2L, 2L, 
    1L, 0L, 1L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 2L, 
    1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 
    0L, 0L, 2L, 1L, 0L, 0L, 0L, 1L), strikes = c(1L, 0L, 1L, 
    1L, 0L, 2L, 2L, 2L, 2L, 2L, 1L, 0L, 0L, 0L, 2L, 2L, 1L, 0L, 
    1L, 0L, 0L, 1L, 0L, 2L, 1L, 0L, 1L, 1L, 0L, 0L, 0L, 2L, 2L, 
    1L, 0L, 2L, 1L, 1L, 0L, 2L, 2L, 1L, 1L, 0L, 2L, 2L, 2L, 1L, 
    0L, 1L)), .Names = c("stand", "zone", "balls", "strikes"), row.names = c(NA, 
50L), class = "data.frame")

  stand zone balls strikes
1     R   12     0       1
2     R    3     0       0
3     R    5     1       1
4     R   14     0       1
5     R    1     0       0
6     L    6     3       2

Вся таблица pitchdata имеет ~ 1M строк, и я хотел бы вычислить количество и проценты для этих столбцов данных. Мои данные имеют 14 вариантов для зон (1:14), 4 для мячей (0: 3), 3 для ударов (0: 2) и 2 для стойки ("L", "R"). Я знаю, что могу создать простую группу с помощью:

pitchdata %>% 
  dplyr::group_by(stand, zone, balls, strikes) %>%
  dplyr::summarise( freq = n() )

однако , я также хотел бы создать сгруппированную группу, включающую в себя stand == "All" (оба "L" и "R"), которые затем я могу создать, исключив stand in группа с:

pitchdata %>% 
  dplyr::group_by(zone, balls, strikes) %>%
  dplyr::summarise( freq = n() ) 

однако еще раз, я также хотел бы сгруппировать, который включает шары == "All" (0, 1, 2, 3), которые я могу создать с помощью:

pitchdata %>% 
  dplyr::group_by(zone, stand, strikes) %>%
  dplyr::summarise( freq = n() ) 

однако три группы по всему выше пропускают группу с подставкой == "Все" и шариками == "Все", так что я могу тогда сделать:

pitchdata %>% 
  dplyr::group_by(zone, strikes) %>%
  dplyr::summarise( freq = n() ) 

... этот подход становится повторяющимся. Чтобы учесть забастовки == "Все", мне нужно сделать еще две групповые байсы:

pitchdata %>% 
  dplyr::group_by(zone, stand, balls) %>%
  dplyr::summarise( freq = n() ) 

pitchdata %>% 
  dplyr::group_by(zone, balls) %>%
  dplyr::summarise( freq = n() ) 

Если бы это был конец, все было бы хорошо, однако мне хотелось бы добавить еще один столбец: общее количество для каждой группы во всех 14 зонах . Например, для группового стенда == "R" & balls == "0" & ​​strikes == "1" я хотел бы получить сумму частот для этой группы во всех 14 зонах. Это можно сделать многословно, если я сделаю дополнительные 7 групповых байтов (по одному на каждый из предыдущих 7 групповых байтов), для каждой исключающей зоны в качестве сгруппированной переменной.

В общей сложности мне нужно выполнить 14 групповых заездов, чтобы достичь желаемого результата. Повторюсь, мой желаемый результат - это кадр данных с 14 (зоны) * 20 (группы подсчета высоты тона) * 3 (слева, справа, все группы) = 840 строк. Каждый ряд должен выглядеть так:

zone  stand  balls  strikes  freq  all_zone_freq  
  12    "R"     0         1   324           1824

, где в этом примере 324 - это счет для зоны 12, подставка R, шары 0 и удары 1, а 1824 - это подсчет для подставки R, шары 0, удары 1 (во всех 14 зонах).

Как я могу сделать это без 14 групповых байтов? И пожалуйста, дайте мне знать, если я смогу объяснить Q лучше

РЕДАКТИРОВАТЬ: 20 групп подсчета высоты тона: 0,0 0,1 0,2 1,0 1,1 1,2 2,0 2,1 2,2 3,0 3,1 3,2 0-шаров, 1-мя, 2-мя, 3- шары, 0 ударов, 1 удар, 2 удара, все считается.

1 Ответ

0 голосов
/ 29 июня 2018

Вы должны сделать:

1 - Создайте expand.grid ()

expand <- pitchdata %>%
expand(zone = zone, stand = stand, balls = balls, strike = strike)

2 - Создать в pitchdata переменную для подсчета:

pitchdata <- pitchdata %>% mutate(count = 1)

3 - Объединить кадры данных:

join <- left_join(expand,pitchdata, by = c(zone = "zone", stand = "stand",
                                             balls = "balls", strike = "strike))

4 - Подсчет наблюдений:

count <- join %>% 
  group_by(zone, stand, balls, strike) %>% 
  summarise(count = sum(count))

5 - я считаю, что он должен работать с несколькими модификациями (или, возможно, без)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...