gpt4 book ai didi

r - 如何进行加入并仅从相关组中选择特定行?

转载 作者:行者123 更新时间:2023-12-01 23:09:32 24 4
gpt4 key购买 nike

我不知道如何准确地表达这个问题。我希望当我为您提供示例时会更清楚:

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

我想将 Playerrating 表中正确的玩家评分分配给 Match 表,这是在 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

谁能帮我解决这个问题?

(这是我在这里的第一个问题,所以请原谅我,如果我的措辞不是很容易理解)

最佳答案

您可以使用 data.table 进行连接,使用 roll=-Inf 回滚下一个值。

library( data.table )

首先将您的数据框转换为数据表。

setDT(Match)
setDT(Playerrating)

将日期转换为 Date 类,以便对其进行适当处理。

Match[ , Date := as.Date( Date, format = "%d.%m.%Y" ) ]
Playerrating[ , Date := as.Date( Date, format = "%d.%m.%Y" ) ]

确保顺序合适。在您的示例中这不是必需的,但这是一种很好的做法。

setorder( Match, PlayerID, Date )
setorder( Playerrating, PlayerID, Date )

加入。注意 roll=-Inf。这就是将下一个可用值带入联接的原因。

Playerrating[ Match, on = .( PlayerID, Date ), roll = -Inf ]

结果:

   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

关于r - 如何进行加入并仅从相关组中选择特定行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52556820/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com