2012-04-10 1 views
1

У меня есть ряд результатов футбольных и хотите узнать, сколько очков команда забила в определенном количестве игрКак создать функцию для plyr

Вот глава подгруппы с накопительными очки, набранные в течение сезона с последнего результата

Я был запястье = -slapped пару раз не использовать dput так терпите длины

allData <- structure(list(team = c("Arsenal", "Tottenham H", "Tottenham H", 
"Arsenal", "Arsenal", "Tottenham H"), venue = c("H", "A", "H", 
"A", "H", "A"), result = c("W", "D", "W", "L", "W", "D"), GF = c(1L, 
0L, 3L, 1L, 3L, 0L), GA = c(0L, 0L, 1L, 2L, 0L, 0L), gameDate = structure(c(1333868400, 
1333782000, 1333263600, 1333177200, 1332572400, 1332572400), class = c("POSIXct", 
"POSIXt"), tzone = ""), season = structure(c(2L, 2L, 2L, 2L, 
2L, 2L), .Label = c("2010/2011", "2011/2012"), class = "factor"), 
points = c(3, 1, 3, 0, 3, 1), GD = c(1L, 0L, 2L, -1L, 3L, 
0L), cumpts = c(3, 1, 4, 3, 6, 5)), .Names = c("team", "venue", 
"result", "GF", "GA", "gameDate", "season", "points", "GD", "cumpts" 
), row.names = c(NA, 6L), class = "data.frame") 

и здесь данные для одной команды в течение одного сезона

spurs <- structure(list(team = c("Tottenham H", "Tottenham H", "Tottenham H", 
"Tottenham H", "Tottenham H", "Tottenham H", "Tottenham H", "Tottenham H", 
"Tottenham H", "Tottenham H", "Tottenham H", "Tottenham H", "Tottenham H", 
"Tottenham H", "Tottenham H", "Tottenham H", "Tottenham H", "Tottenham H", 
"Tottenham H", "Tottenham H", "Tottenham H", "Tottenham H", "Tottenham H", 
"Tottenham H", "Tottenham H", "Tottenham H", "Tottenham H", "Tottenham H", 
"Tottenham H", "Tottenham H", "Tottenham H", "Tottenham H"), 
    venue = c("A", "H", "A", "H", "A", "H", "A", "H", "A", "H", 
    "A", "H", "H", "H", "A", "A", "H", "H", "A", "H", "A", "H", 
    "A", "H", "A", "A", "H", "A", "H", "A", "H", "A"), result = c("D", 
    "W", "D", "D", "L", "L", "L", "W", "D", "W", "L", "D", "W", 
    "W", "D", "W", "D", "W", "L", "W", "W", "W", "W", "W", "W", 
    "D", "W", "W", "W", "W", "L", "L"), GF = c(0L, 3L, 0L, 1L, 
    0L, 1L, 2L, 5L, 0L, 3L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 
    3L, 3L, 2L, 3L, 3L, 2L, 2L, 2L, 2L, 4L, 2L, 1L, 0L), GA = c(0L, 
    1L, 0L, 1L, 1L, 3L, 5L, 0L, 0L, 1L, 3L, 1L, 0L, 0L, 1L, 0L, 
    1L, 0L, 2L, 0L, 1L, 0L, 1L, 1L, 1L, 2L, 1L, 1L, 0L, 0L, 5L, 
    3L), gameDate = structure(c(1333782000, 1333263600, 1332572400, 
    1332313200, 1331366400, 1330848000, 1330243200, 1328947200, 
    1328515200, 1327996800, 1327219200, 1326528000, 1326268800, 
    1325577600, 1325318400, 1324972800, 1324540800, 1324281600, 
    1323590400, 1322899200, 1322294400, 1321862400, 1320562800, 
    1319958000, 1319353200, 1318748400, 1317538800, 1316847600, 
    1316329200, 1315638000, 1314514800, 1313996400), class = c("POSIXct", 
    "POSIXt"), tzone = ""), season = structure(c(2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("2010/2011", 
    "2011/2012"), class = "factor"), points = c(1, 3, 1, 1, 0, 
    0, 0, 3, 1, 3, 0, 1, 3, 3, 1, 3, 1, 3, 0, 3, 3, 3, 3, 3, 
    3, 1, 3, 3, 3, 3, 0, 0), GD = c(0L, 2L, 0L, 0L, -1L, -2L, 
    -3L, 5L, 0L, 2L, -1L, 0L, 2L, 1L, 0L, 2L, 0L, 1L, -1L, 3L, 
    2L, 2L, 2L, 2L, 1L, 0L, 1L, 1L, 4L, 2L, -4L, -3L), cumpts = c(1, 
    4, 5, 6, 6, 6, 6, 9, 10, 13, 13, 14, 17, 20, 21, 24, 25, 
    28, 28, 31, 34, 37, 40, 43, 46, 47, 50, 53, 56, 59, 59, 59 
    )), .Names = c("team", "venue", "result", "GF", "GA", "gameDate", 
"season", "points", "GD", "cumpts"), row.names = c(NA, -32L), class = "data.frame") 

Я тогда этот код на dataframe отрогов рассчитать очки, набранные в определенных длинах игр (здесь 5)

gameLength <- 5 
seasonLength <- nrow(spurs) 
cumPoints <- c() 
cumPoints[1] <- spurs[gameLength,]$cumpts 
for (i in gameLength+1:seasonLength) { 
cumPoints[i-(gameLength-1)] <- ((spurs[i,]$cumpts)- 
(spurs[i-gameLength,]$cumpts)) 
} 
cumPoints <- cumPoints[!is.na(cumPoints)] # not sure why throws up NAs 

Это дает правильный вывод

[1] 6 5 2 4 4 7 7 8 8 10 8 11 11 11 8 10 10 12 12 15 15 
[22] 13 13 13 13 13 12 9 

, но мне нужен быть в состоянии преобразовать allData с столбцом, содержащим эти данные за каждый сезон, и командой в кадре данных.

Я предполагаю, что я должен использовать ddply как-то, если нет лучшей альтернативы

+0

Что делает строка 'for (i в gameLength + 1: seasonLength) {' имеет отношение к длине игры? Он просто действует во всех играх, за исключением первого 4. Где длина игры в данных –

+0

gameLength - это игра, в которой меня интересует. Поэтому меня интересуют очки, полученные командой в 5 играх протяжение. Шпоры последних пяти игр собрали их 1,3,1,1,0 балла на общую сумму 6. Предыдущие они потеряли, так что 0 заменяет 1 и cumPoints [2] равно 5 и т. Д. – pssguy

+0

Приоритет оператора «:» против « + "каждый раз будет вас трогать с помощью кода типа' for (i в gameLength + 1: seasonLength) '. Вам нужно внедрить практику использования парных парнеров, чтобы избежать этой проблемы. –

ответ

1

Чтобы повторить ваш вывод:

library(zoo) 
rollapply(spurs$GD, gamelength, sum) 

И если у вас есть ALLDATA, который выглядит как отрогов data.frame .. .

rollsum <- function(df, gamelen=gamelength) { 
    require(zoo) 
    out <- rollapply(df$points, gamelen, sum) 

    return(out) 
} 

ddply(allData, .(team), rollsum) 
+0

Спасибо Джастин. Похоже, что я установил правильный путь. Я хочу разделить команду и сезон, и это вызывает ошибку «Ошибка в list_to_dataframe (res, attr (.data,« split_labels »)): Результаты не имеют одинаковой длины« Это верно, так как длина сезона варьируется. Решение состоит в том, чтобы использовать dlply и сделать хакерство для создания фрейма данных. Может быть, лучше, но, похоже, работает – pssguy