如何在R中有条件地对最后n行进行求和

时间:2015-09-29 23:00:45

标签: r

我有一个非常长的数据框(master),如下所示: (最后一行是我期望得到但我无法弄清楚如何去做)

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

我想创建一个新专栏(最后3场比赛中的队/分数),显示最近3场比赛中每支球队的累计积分总和。 最后一排球队的比赛应该总结过去3场比赛中该球队的得分。

我可以为每支球队的比赛建立过去累积的积分总数,但我无法弄清楚如何将这笔总和限制在最近的三场比赛中......

这是我的代码:

>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 个答案:

答案 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