Есть ли функция R, чтобы дать мне сумму значений на основе двух других переменных? - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть набор данных игроков NBA и их статистика производительности, такие как сыгранные игры, очки за сезон и т. Д. c. У меня есть несколько сезонов для каждого игрока и столбец Season.End , который указывает год, из которого получены данные. Столбец G указывает на игры, сыгранные в этот конкретный сезон.

   Season.End Player Pos     Age Tm        G    GS    MP   PER OWS     DWS WS   
        <int> <chr>  <fct> <int> <fct> <int> <int> <int> <dbl> <chr> <dbl> <chr>
 1       2001 A.C. ~ PF       37 MIA      82     1  1411  11.2 1.1     2.1 3.2  
 2       2002 A.J. ~ PG       23 CHI      45     6   607  11.8 0       0   0.1  
 3       2001 A.J. ~ PG       22 CHI      33     8   630  10.3 0.4    -0.1 0.3  
 4       2003 A.J. ~ PG       24 GSW       2     0     9  -9   -0.1    0   -0.1 
 5       2017 A.J. ~ C        24 DAL      22     0   163   8.4 -0.2    0.2 0    
 6       2013 A.J. ~ PG       26 WAS      57    22  1278  12.4 1       1.2 2.2  
 7       2010 A.J. ~ PG       23 IND      56     2   865  14   0.4     0.8 1.2  
 8       2011 A.J. ~ PG       24 IND      50     0   795  10.7 -0.4    0.7 0.3  
 9       2012 A.J. ~ PG       25 IND      44     1   568  11.5 0.2     0.5 0.7  
10       2014 A.J. ~ SG       27 MIN      28     0    99   9.7 -0.1    0   0  

Я хотел бы добавить столбец, в котором подводится итог количества игр, в которые игрок играл в предыдущие сезоны, то есть перед началом сезона. В идеале это выглядело бы примерно так:

   Season.End Player Pos     Age Tm        G    total_games
         2001 A.J.   PG      22  CHI       33           0   
         2002 A.J.   PG      23  CHI       45           33
         2003 A.J.   PG      24  GSW       2            78  
         2014 B.K.   C       27  HOU       50           0
         2015 B.K.   C       28  HOU       74           50
         2016 B.K.   C       29  HOU       66           124

Я пробовал несколько вариантов использования функции dplyr, таких как group_by, summary, et c. и посмотрел на преобразование моего столбца Season.End в формат даты, но мне так и не удалось получить желаемые результаты.

У кого-нибудь есть решение моей проблемы?

1 Ответ

0 голосов
/ 11 апреля 2020

Сначала вы группируете данные по Player, а затем сортируете по Season, используя arrange. Новый столбец, содержащий итоговую сумму игр, рассчитывается с cumsum и добавляется к record с mutate. c(0,head(cumsum(G),-1) ) используется для отображения 0 в течение первого года игрока, а затем, используя head(cumsum(G) ,-1), следует текущая сумма игр, кроме последней.

Я изменил пример входных данных, чтобы сделать его больше похоже на ваш пример вывода. Код выглядит так:

  record <- tribble(
   ~Season_End, ~Player,  ~Pos, ~Age, ~G,    
     2001,      "A.C.",   "PF",       37,       82,     
     2002,       "A.J.",   "PG",       23,       45,    
     2001,       "A.J.",    "PG",       22,       33,    
     2003,       "A.J.",   "PG",       24,       2,      
     2017,       "B.K.",   "C",        24,       22,        
     2013,       "B.K.",   "PG",       26,       57,    
     2010,       "B.K.",   "PG",       23,       56 )   

record <- record %>% group_by(Player) %>% 
          arrange( Season_End) %>%
          mutate(total_games = c(0,head(cumsum(G),-1) ))

, что дает результат

Season_End Player Pos     Age     G total_games
       <dbl> <chr>  <chr> <dbl> <dbl>       <dbl>
1       2001 A.C.   PF       37    82           0
2       2001 A.J.   PG       22    33           0
3       2002 A.J.   PG       23    45          33
4       2003 A.J.   PG       24     2          78
5       2010 B.K.   PG       23    56           0
6       2013 B.K.   PG       26    57          56
7       2017 B.K.   C        24    22         113
...