我有一个非常长的数据框(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连接。它可以在每场比赛之前提供为每支球队获得的总积分,但现在我想要相同但仅限于最后三场比赛。
答案 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