我不知道如何准确地说出这个问题.我希望当我向你提供一个例子时,它会变得更加清晰:
Match <- data.frame(PlayerID=c(1,2,2,3,3), Date = c("01.04.2012","05.04.2012","20.04.2012","23.04.2012","30.04.2012"))
Playerrating <- data.frame(PlayerID = c(1,1,1,2,2,2), Date= c("01.03.2012","02.04.2012","01.05.2012","01.03.2012","19.04.2012","25.04.2012"),Rating=c(64,71,55,59,73,81))
> Match
PlayerID Date
1 01.04.2012
2 05.04.2012
2 20.04.2012
3 23.04.2012
3 30.04.2012
> Playerrating
PlayerID Date Rating
1 01.03.2012 64
1 02.04.2012 71
1 01.05.2012 55
2 01.03.2012 59
2 19.04.2012 73
2 25.04.2012 81
Run Code Online (Sandbox Code Playgroud)
我想从Matchrating表中为Match table分配正确的玩家评分,这是在Match表中指定的日期之后特定玩家的第一个评分.在这种情况下,它应如下所示:
Match
PlayerID Date Rating
1 01.04.2012 71
2 05.04.2012 73
2 20.04.2012 81
3 23.04.2012 NA
3 30.04.2012 NA
Run Code Online (Sandbox Code Playgroud)
anybode可以帮我解决这个问题吗?
(这是我的第一个问题所以请原谅我,如果我没有说明这一点非常易于理解)
你可以进行连接data.table,roll=-Inf用来滚动下一个值.
library( data.table )
Run Code Online (Sandbox Code Playgroud)
首先将数据帧转换为数据表.
setDT(Match)
setDT(Playerrating)
Run Code Online (Sandbox Code Playgroud)
将日期转换为Date课程,以便他们得到适当的对待.
Match[ , Date := as.Date( Date, format = "%d.%m.%Y" ) ]
Playerrating[ , Date := as.Date( Date, format = "%d.%m.%Y" ) ]
Run Code Online (Sandbox Code Playgroud)
确保订单合适.在您的示例中,这不是必需的,但这是一种很好的做法.
setorder( Match, PlayerID, Date )
setorder( Playerrating, PlayerID, Date )
Run Code Online (Sandbox Code Playgroud)
加入吧.请注意roll=-Inf.这就是将下一个可用值带入连接的原因.
Playerrating[ Match, on = .( PlayerID, Date ), roll = -Inf ]
Run Code Online (Sandbox Code Playgroud)
结果:
PlayerID Date Rating
1: 1 2012-04-01 71
2: 2 2012-04-05 73
3: 2 2012-04-20 81
4: 3 2012-04-23 NA
5: 3 2012-04-30 NA
Run Code Online (Sandbox Code Playgroud)