[英]In R, how can I add values onto the end of rows where one value matches that of another data frame?
我目前有两个正在使用的数据框。 第一个是 MLB 棒球比赛的数据集,包含比赛日期和球员 ID。
游戏日志
日期 | 击球手 1 ID | 击球手 2 ID |
---|---|---|
5月1日 | 乔 | 凯文 |
5月1日 | 约翰 | 塞缪尔 |
5月2日 | 乔 | 凯文 |
5月2日 | 约翰 | 塞缪尔 |
第二个数据集包含本赛季的球员统计数据。 此数据集是从 web 中提取的,因此可以更新以包含每个玩家的所有统计数据,直到列出的游戏日期。 例如,您可以在下面看到两个不同日期的数据框。
5月1日
击球手编号 | 点击数 | 本垒打 | 击球率 |
---|---|---|---|
乔 | 15 | 4个 | .244 |
约翰 | 18 | 6个 | .261 |
凯文 | 29 | 16 | .347 |
塞缪尔 | 7 | 1个 | .161 |
5月2日
击球手编号 | 点击数 | 本垒打 | 击球率 |
---|---|---|---|
乔 | 16 | 4个 | .247 |
约翰 | 19 | 6个 | .265 |
凯文 | 30 | 17 | .343 |
塞缪尔 | 9 | 2个 | .180 |
我想做的是遍历游戏列表,在日期和击球手 ID 匹配的地方,将第二个数据框中的统计数据添加到正确行的末尾。 令我困扰的部分是,对于第一个数据框中的每一行,都有多个 Batter ID 需要匹配。
我最初的想法是使用嵌套循环来执行此操作,但我无法找到一个解决方案,让我按顺序遍历每一行,以便我可以限制我抓取数据的次数。
这是我最初思考过程的开始。
for (i in rows) {
if (i %in% BatterID){
...
}
}
有什么想法吗? 谢谢。
您需要将 stats 数据框组合成一个带有Date
列的数据框,然后这是一个简单的连接。
是这样的:
# put all the stats data frames in a list
stats = list(May_1 = May_1, May_2 = May_2)
# (in your real case you probably want to use `stats = mget(ls(pattern = ...))`
# where `pattern` is a regex pattern to identify these data frames
# combine them and get rid of the underscores
library(dplyr)
library(stringr)
stats_df = bind_rows(stats, .id = "Date") %>%
mutate(Date = str_replace(Date, pattern = "_", replacement = " "))
# and join
Game_Logs %>%
left_join(
stats_df,
by = c("Date", "Batter 1 ID" = "Batter ID")
) %>%
left_join(
stats_df,
by = c("Date", "Batter 2 ID" = "Batter ID",
suffix = c(".1", ".2")
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.