2015-08-07 2 views
-2

У меня есть следующие данные:Как рассчитать эту переменную в R

mydf[77:84,] 
    id game_week points code web_name first_name second_name position team_name  date fixture team1 team2 home_away team_scored team_conceded minutes goals assists cleansheet goals_conceded own_goals 
77 3   1  -2 51507 Koscielny Laurent Koscielny Defender Arsenal 17/08/13 ARS-AVL ARS AVL   H   1    3  67  0  0   0    3   0 
78 3   2  0 51507 Koscielny Laurent Koscielny Defender Arsenal 24/08/13 FUL-ARS ARS FUL   A   3    1  0  0  0   0    0   0 
79 3   3  6 51507 Koscielny Laurent Koscielny Defender Arsenal 01/09/13 ARS-TOT ARS TOT   H   1    0  90  0  0   1    0   0 
80 3   4  2 51507 Koscielny Laurent Koscielny Defender Arsenal 14/09/13 SUN-ARS ARS SUN   A   3    1  90  0  0   0    1   0 
81 3   5  2 51507 Koscielny Laurent Koscielny Defender Arsenal 22/09/13 ARS-STK ARS STK   H   3    1  90  0  0   0    1   0 
82 3   6  2 51507 Koscielny Laurent Koscielny Defender Arsenal 28/09/13 SWA-ARS ARS SWA   A   2    1  90  0  0   0    1   0 
83 3   7  3 51507 Koscielny Laurent Koscielny Defender Arsenal 06/10/13 WBA-ARS ARS WBA   A   1    1  90  0  0   0    1   0 
84 3   8  2 51507 Koscielny Laurent Koscielny Defender Arsenal 19/10/13 ARS-NOR ARS NOR   H   4    1  90  0  0   0    1   0 

В рамках моделирования упражнений, я хочу, чтобы создать новую переменную «mov_avg_min», который для данного «ид», это среднее значение «минут», которое было сыграно в последних 3 играх «game_week». Например, для web_name «Koscielny» его отдельный «id» равен 3 в этой data_frame. Итак, для id = 3 и game_week = 4 функция должна вычислять mov_avg_min of game_weeks 1: 3 (3 game_week перед текущей игрой game_week для того же значения id). Таким образом, в строке 80, mov_avg_min = 1/3 (67 + 0 + 90) = 52,333

+2

Это должно быть что-то вроде 'ДФ%>% group_by (ID)%>% мутировать (mov_avg_min = средняя (NTH (мин, длина (мин) - 3)))' 'с dplyr' но это звучит как работа, которую вы должны делать, и хотите, чтобы другие делали, так как вы не прилагали никаких усилий для решения своей проблемы самостоятельно. – SabDeM

+0

Возможный дубликат [R: выбор первого из n последовательных строк выше определенного порогового значения] (http://stackoverflow.com/questions/31373256/r-selecting-first-of-n-consecutive-rows-above-a- определенное-пороговое значение) – chappers

+1

Если вы используете 'dplyr' с' rollapply', вы можете получить ответ: 'dat%>% group_by (id)%>% mutate (mov_avg_min = rollapply (минуты, ширина = 3, среднее, выровнять = "right", fill = NA, na.rm = TRUE)) ' – chappers

ответ

0

Я думаю, что rollapply (из zoo пакета) с width = 3 будет включать значение строки вы считаете. Таким образом, для игры 4 это даст вам среднее количество минут в играх 2,3 и 4. Я думаю, что вы должны сделать lag столбец минут, чтобы получить среднее значение на основе игр 1,2 и 3. См. Простой пример ниже:

library(dplyr) 
library(zoo) 

dt = data.frame(id = c(1,1,1,1,1,2,2,2,2,2), 
       games = c(1,2,3,4,5,1,2,3,4,5), 
       minutes = c(61,72,73,82,82,81,71,51,90,73)) 

dt 

# id games minutes 
#  1 1  1  61 
#  2 1  2  72 
#  3 1  3  73 
#  4 1  4  82 
#  5 1  5  82 
#  6 2  1  81 
#  7 2  2  71 
#  8 2  3  51 
#  9 2  4  90 
#  10 2  5  73 

dt %>% group_by(id) %>% 
    mutate(lag_minutes = lag(minutes, default=NA)) %>% 
    mutate(RA = rollapply(lag_minutes,width=3,mean, align= "right", fill=NA)) 


# Source: local data frame [10 x 5] 
#  Groups: id 
#  
#   id games minutes lag_minutes  RA 
#  1 1  1  61   NA  NA 
#  2 1  2  72   61  NA 
#  3 1  3  73   72  NA 
#  4 1  4  82   73 68.66667 
#  5 1  5  82   82 75.66667 
#  6 2  1  81   NA  NA 
#  7 2  2  71   81  NA 
#  8 2  3  51   71  NA 
#  9 2  4  90   51 67.66667 
#  10 2  5  73   90 70.66667 
Смежные вопросы