【问题标题】:Find values in data frame and return them in new column in data frame在数据框中查找值并将它们返回到数据框中的新列中
【发布时间】:2021-11-17 17:07:07
【问题描述】:

数据框为 12 列 id, season, week, season_type, start_date, home_team, home_points, away_team, away_points, Line, home_cover, away_cover

        id season  week season_type start_date home_team        home_points away_team             away_points  Line home_cover away_cover
      <dbl>  <dbl> <dbl> <chr>            <dbl> <chr>                  <dbl> <chr>                       <dbl> <dbl> <chr>      <chr>     
1 400603840   2015     1 regular         42251. South Carolina            17 North Carolina                 13  -3.5 Y          N         
2 400763593   2015     1 regular         42251. UCF                       14 Florida International          15 -17   N          Y         
3 400763399   2015     1 regular         42251. Central Michigan          13 Oklahoma State                 24  20.5 Y          N         
4 400603839   2015     1 regular         42251  Vanderbilt                12 Western Kentucky               14 -17.5 N          Y         
5 400756883   2015     1 regular         42251. Utah                      24 Michigan                       17  -3   Y          N         
6 400763398   2015     1 regular         42251. Minnesota                 17 TCU                            23  16   Y          N         

想要找出每个客队和主队在前一周打过的球队 我一辈子都想不通

【问题讨论】:

  • 根据这个数据,前一周没有人玩任何东西。我建议您阅读stackoverflow.com/q/5963269minimal reproducible examplestackoverflow.com/tags/r/info,了解有关使问题自包含且可重现(关键字)的讨论,包括以下数据既能代表您的问题,又能代表您的问题。
  • 是的,这只是 2015-2020 年第 1-16 季的头周,这个问题还需要多少时间?
  • 想一想:您需要多少周才能看到一个解决方案,您认为该方法可以稳健且始终如一地运行?一周显然不够;两周?碰巧成功了可能是幸运的。三周时间越来越好。我在下面的回答显示了四个星期,我认为这可以合理地证明问题。如果您愿意,可以使用我的数据进行测试(它是完全可重现的),然后根据您自己的数据调整(列名等)。

标签: r dataframe function loops


【解决方案1】:

我会为此建议dplyr,因为我认为它更容易理解流程。

不过,首先,您的示例数据不包括多个星期,因此不足以证明这一点。下面是一个小样本数据(这部分不要着急理解,只是为了造假数据):

library(dplyr)
set.seed(42)
dat <- bind_rows(lapply(1:4, function(w) data.frame(season=2021, week=w, home_team=sample(LETTERS[1:4]), away_team=sample(LETTERS[5:8]))))
dat
#    season week home_team away_team
# 1    2021    1         A         F
# 2    2021    1         D         H
# 3    2021    1         C         G
# 4    2021    1         B         E
# 5    2021    2         D         H
# 6    2021    2         C         E
# 7    2021    2         B         G
# 8    2021    2         A         F
# 9    2021    3         D         G
# 10   2021    3         B         E
# 11   2021    3         C         H
# 12   2021    3         A         F
# 13   2021    4         D         E
# 14   2021    4         A         F
# 15   2021    4         C         G
# 16   2021    4         B         H

从这里开始,我们将 (1) 每周转移数据,然后 (2) “加入”两次。 (有关合并/加入概念的详细信息,请参阅 How to join (merge) data frames (inner, outer, left, right)What's the difference between INNER JOIN, LEFT JOIN, RIGHT JOIN and FULL JOIN?

shifted <- dat %>%
  transmute(week = week + 1, home_prevaway = home_team, away_prevaway = away_team)
left_join(dat, shifted, by = c("week", "home_team" = "home_prevaway")) %>%
  left_join(., shifted, by = c("week", "away_team" = "away_prevaway"))
#    season week home_team away_team away_prevaway home_prevaway
# 1    2021    1         A         F          <NA>          <NA>
# 2    2021    1         D         H          <NA>          <NA>
# 3    2021    1         C         G          <NA>          <NA>
# 4    2021    1         B         E          <NA>          <NA>
# 5    2021    2         D         H             H             D
# 6    2021    2         C         E             G             B
# 7    2021    2         B         G             E             C
# 8    2021    2         A         F             F             A
# 9    2021    3         D         G             H             B
# 10   2021    3         B         E             G             C
# 11   2021    3         C         H             E             D
# 12   2021    3         A         F             F             A
# 13   2021    4         D         E             G             B
# 14   2021    4         A         F             F             A
# 15   2021    4         C         G             H             D
# 16   2021    4         B         H             E             C

home_prevaway是当前主队上一场比赛的球队; away_prevaway 也是如此。

为了验证,在第 1 周,“B”队(主场)对阵“E”队(客场),“D”队对阵“H”队。在第 2 周,B 的 home_prevaway 是“E”,D 的 home_prevaway 是“H”。 (考虑到随机数据,A 队和 D 队连续两周在客场比赛相同的事实是不方便的巧合。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多