2015-09-29 2 views
-1

У меня есть очень длинный кадр данных (мастер), как это: (последняя строка, что я ожидаю, чтобы получить, но я не мог понять, как это сделать)Как суммировать последние п строк условно в R

id  Match  Points   Team  Team/Points in last 3 matches 
44631 154235  3   Nacional 4 
44623 154231  3  Millonarios 3 
44639 154239  1   Nacional 4 
44640 154239  1   Junior 4 
44637 154238  1  Millonarios 5 
44670 154260  3   Junior 2 
44657 154249  3   Nacional 2 
44668 154258  1  Millonarios 7 
44495 154149  0   Nacional 3 
44685 154263  1   Junior 1 
44687 154266  1   Nacional 3 
44688 154266  1  Millonarios 6 
44698 154265  3  Millonarios 3 
44695 154264  0   Junior 1 
44707 154274  1   Nacional 2 
44713 154273  1   Nacional 1 
44724 154281  3  Millonarios 0 
44725 154282  1   Junior 0 
44737 154991  1   Nacional 0 

И я хочу создать новый столбец (Team/Points в последних 3 матчах), который показывает суммарную сумму очков для каждой команды за последние 3 матча. То, что последний ряд матча команды должен суммировать очки, набранные для этой команды в последних 3 матчах.

я мог бы построить прошлое накопленную сумму очков за каждый матч team's, но я couldn't выяснить, как ограничить эту сумму в трех последних матчах ...

Это мой код:

>master$ptos_antes <- ave(master$points,master$teamXtourn, 
        FUN=function(x) cumsum(c(0, head(x,-1))) 
) 

master$teamXtourn является ключевым полем, которое я сделал, чтобы подмножество последних матчей накопленную сумму на турнире сезона. Является ли master $ id_team конкатенированным с master $ id_tournament. Он работает нормально, чтобы обеспечить общее количество очков, полученных для каждой команды перед каждым матчем, но теперь я хочу того же, но ограничено до последних трех матчей.

+1

Нет подходящих дат. Являются ли матчи в хронологическом порядке? Или должны ли данные упорядочиваться по идентификатору Match как переменной времени? –

+1

Это называется столбцом, а не строкой. Кроме того, почему в первой строке уже есть 4 кумулятивных пункта? –

+0

Да. Есть даты матчей. Мне жаль, что я не включил их в образец данных. Матчи сортируются по дате_мач. –

ответ

1

Я предположил, что по сумме очков в последних трех матчах вы включаете очки, которые были заработаны во время рассматриваемой игры. Например, если номер игры равен 4, вам нужно будет суммировать все очки из игр 4, 3, 2 и 1. Если это не так, то измените игру - 3 на игру - 2.

# create some data 
library(dplyr) 
data.frame(teams = rep(c("team1", "team2", "team3"), 33), 
      match_number = sample(1:1000, 99, replace = FALSE), 
      points = sample(1:100, 99, replace = TRUE)) -> dat 

# get the relative match numbers for each team 
dat %>% 
    group_by(teams) %>% 
    mutate(game_num = rank(match_number)) %>% 
    as.data.frame -> z 

# sum the points in the last 3 games 
last3 <- function(x) { 
    z[x, "teams"] -> team 
    z[x, "game_num"] -> game 
    game - 3 -> last_three 
    if(last_three < 1) last_three <- 1 
    z[z$game_num %in% last_three:game & 
      z$teams == team, "points"] -> pnts 
    sum(pnts) 
} 

sapply(1:nrow(z), FUN = last3) -> z$points_last3 
+0

Отлично! Это легко. Еще одно: если я хотел сортировать совпадения по game_date, мне просто нужно изменить rank() вместо присваиваемой строки? –

+0

, если вы хотите отсортировать данные после того, как они уже были обработаны (другими словами, если вы хотите отсортировать фрейм данных z), то вы можете использовать функцию аранжировки в dplyr или функцию заказа – Chris

Смежные вопросы