在R中,如何在一个值与另一个数据框的值匹配的行的末尾添加值?

k10s72fa  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(129)

我目前有两个数据框架,第一个是MLB棒球比赛的数据集,包含比赛日期和球员ID。
游戏日志(_L)
| 日期|电池1 ID|电池2 ID|
| - -|- -|- -|
| 五月一日|乔|凯文|
| 五月一日|若翰|山缪|
| 五月二日|乔|凯文|
| 五月二日|若翰|山缪|
第二个数据集包含本赛季的球员统计数据。该数据集是从网络上抓取的,因此可以更新为包含每个球员截至所列比赛日期的所有统计数据。例如,下面您可以看到两个不同日期的数据框。
5月_1日
| 电池ID|点击数|本垒打|打击率|
| - -|- -|- -|- -|
| 乔|十五|四个|点二四四|
| 若翰|十八|六个|点二六一口径|
| 凯文|二十九人|十六|点三四七口径|
| 山缪|七个|一个|点一六一|
5月2日
| 电池ID|点击数|本垒打|打击率|
| - -|- -|- -|- -|
| 乔|十六|四个|点二四七|
| 若翰|十九|六个|点二六五|
| 凯文|三十|十七岁|点三四三口径|
| 山缪|九个|2个|点180口径|
我想做的是循环遍历比赛列表,在日期和击球手ID匹配的地方,将第二个数据框中的统计数据添加到正确行的末尾。让我感到困扰的是,对于第一个数据框中的每一行,都有多个击球手ID需要匹配。
我最初的想法是使用嵌套循环来实现这一点,但我很难找到一个解决方案,让我按顺序循环通过每一行,以便我可以限制我抓取数据的次数。
这是我最初思考过程的开始。

for (i in rows) {
      if (i %in% BatterID){
        ...
  }
}

有什么想法吗?谢谢。

inb24sb2

inb24sb21#

您需要将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")
  )

相关问题