У меня есть dataframe с некоторыми данными бейсбола, который выглядит следующим образом:
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
Вся таблица тангажей имеет ~ 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() )
однако я также хотел бы создать группу сгруппированных групп, которая включает в себя стенд == «Все» (как «L», так и «R»), который я могу создать, исключив позицию в группе с помощью:
pitchdata %>%
dplyr::group_by(zone, balls, strikes) %>%
dplyr::summarise( freq = n() )
но опять же, я хотел бы также сгруппировать, включая шары == «Все» (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 групповых рядов для достижения желаемого результата. Повторяю, мой желаемый результат - это dataframe с 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 лучше!
EDIT: 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-ударами, всенаправленными.