如何进行连接并仅从相关组中选择特定行?

Han*_*ber 3 r

我不知道如何准确地说出这个问题.我希望当我向你提供一个例子时,它会变得更加清晰:

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可以帮我解决这个问题吗?

(这是我的第一个问题所以请原谅我,如果我没有说明这一点非常易于理解)

ros*_*ova 5

你可以进行连接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)