Суммирование сгруппированных данных с сохранением всех столбцов, которые являются факторами - PullRequest
1 голос
/ 07 мая 2019

У меня есть большой фрейм данных, содержащий данные о производительности для нескольких человек в течение определенного периода времени. Вместо того, чтобы каждый человек выполнял каждое отдельное выступление, я хочу иметь фрейм данных, содержащий итоговые / средние значения каждого отдельного человека. Вот примерный кадр данных:

name<-c("dwayne", "alf", "christine", "katerina", "dwayne", "christine")
team<- c("halifax", "hamilton", "calgary", "winnipeg", "halifax", "calgary")
pos<- c("left", "middle", "middle", "right", "left", "middle")
amt1<- c(4, 2, 5, 8, 5, 7)
amt2 <- c(12, 14, 13, 18, 17, 18)
perc1<- c(.55, .24, .67, .45, .34, .54)
perc2<- c(.12, .14, .16, .04, .02, .13)

df<-data_frame(team, pos, name, amt1, amt2, perc1, perc2)

До сих пор я выяснил, как использовать group_by и sumrize_if для достижения этой цели с помощью числовых столбцов, например:

tot<-df %>%
  group_by(name) %>%
  summarise_at(vars(amt1:amt2), sum)

av <- df %>%
  group_by(name) %>%
  summarise_at(vars(perc1:perc2), mean)

bnd<-cbind(tot, av)

bnd <- bnd[, !duplicated(colnames(bnd))]

Однако моя проблема заключается в следующем: этот метод возвращает фрейм данных, который не содержит столбцы «pos» или «team». Это ключевые элементы информации при анализе этих данных, но не числовые, поэтому они отбрасываются при использовании суммирования функция. Как я могу вернуть фрейм данных "bnd", сохраняя эти факторные векторы?

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

Если вам не нужно суммировать результаты игроков отдельно для каждой команды или позиции, то другой вариант для работы с несколькими командами / позициями - оставить их всех. Для каждого name объедините уникальные значения team в одну строку, а также для pos. Например:

library(tidyverse)

# Added a couple of additional rows for illustration
df = data.frame(name=c("dwayne", "alf", "christine", "katerina", "dwayne", "christine", "christine", "dwayne"),
                team= c("halifax", "hamilton", "calgary", "winnipeg", "halifax", "calgary", "halifax","halifax"),
                pos= c("left", "middle", "middle", "right", "left", "middle", "middle","middle"),
                amt1= c(4, 2, 5, 8, 5, 7,5,5),
                amt2 = c(12, 14, 13, 18, 17, 18,17,13),
                perc1= c(.55, .24, .67, .45, .34, .54,.56,.51),
                perc2= c(.12, .14, .16, .04, .02, .13, .11, .09))

df %>% 
  group_by(name) %>% 
  mutate(team = paste(unique(team), collapse="-"),
         pos = paste(unique(pos), collapse="-")) %>% 
  group_by(name, team, pos) %>% 
  summarise_at(vars(amt1:amt2), sum)
  name      team            pos          amt1  amt2
1 alf       hamilton        middle          2    14
2 christine calgary-halifax middle         17    48
3 dwayne    halifax         left-middle    14    42
4 katerina  winnipeg        right           8    18
0 голосов
/ 07 мая 2019

Пока комбинация team, pos и name уникальна, вы можете включить эти переменные в свою группу

tot <- df %>%
  group_by(team, pos, name) %>%
  summarise_at(vars(amt1:amt2), sum) %>%
  ungroup()

# A tibble: 4 x 5
  team     pos    name       amt1  amt2
  <chr>    <chr>  <chr>     <dbl> <dbl>
1 calgary  middle christine    12    31
2 halifax  left   dwayne        9    29
3 hamilton middle alf           2    14
4 winnipeg right  katerina      8    18
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...