Оспаривание группы по R на нескольких столбцах

У меня есть 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-ударами, всенаправленными.

r,group-by,dplyr,

0

Ответов: 1


0

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

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

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

2 - Создайте в тангажах переменную для count:

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 - я считаю, что он должен работать с несколькими модификациями (или, может быть, нет)

г, группа мимо, dplyr,
Похожие вопросы
Яндекс.Метрика