У меня есть датафрейм с некоторыми данными о бейсболе, который выглядит следующим образом:
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 удара, все считается.