【问题标题】:Compare values in data.frame from different rows [closed]比较来自不同行的data.frame中的值[关闭]
【发布时间】:2016-09-06 20:16:38
【问题描述】:

我有一个大学橄榄球数据的 R data.frame,每场比赛有两个条目(每支球队一个,带有统计数据等)。我想比较这些点以创建二进制 Win/Loss 变量,但我不知道如何(我对 R 不是很有经验)。 有没有一种方法可以遍历列并尝试将它们与另一列匹配(我有一个游戏 ID 变量,所以我会匹配它)并通过比较点值创建上述二进制赢/输变量?

数据框摘录(遗漏了许多变量):

Team Code  Name      Game Code            Date          Site    Points
5         Akron      5050320051201     12/1/2005        NEUTRAL   32
5         Akron     404000520051226    12/26/2005       NEUTRAL   23
8         Alabama   419000820050903    9/3/2005         TEAM      37
8         Alabama   664000820050910    9/10/2005        TEAM      43

我想要的是追加一个新列,一个二进制变量,根据团队是赢还是输来分配 1 或 0。为了弄清楚这一点,我需要获取游戏代码,例如 5050320051201,找到具有相同游戏代码的另一行(对于该游戏中的另一支球队,只有另一行具有相同的游戏代码),然后比较分数两者的值,并使用它为 Win/Loss 变量分配 1 或 0。

【问题讨论】:

  • 您能否提供一个数据框示例,以及您希望输出的内容?我无法准确理解您要完成的工作。
  • how to create a reproducible example。为该输入提供样本数据和所需的输出。准确描述您遇到困难的地方。
  • 添加了一些示例数据和更好的解释
  • @John:您应该添加一个示例,其中每个唯一的游戏代码恰好有两个团队。

标签: r loops dataframe match lookup


【解决方案1】:

假设您的数据对于每个唯一的Game Code 恰好有两个团队,并且没有以下示例给出的平局:

df <- structure(list(`Team Code` = c(5L, 6L, 5L, 5L, 8L, 9L, 9L, 8L
), Name = c("Akron", "St. Joseph", "Akron", "Miami(Ohio)", "Alabama", 
"Florida", "Tennessee", "Alabama"), `Game Code` = structure(c(1L, 
1L, 2L, 2L, 3L, 3L, 4L, 4L), .Label = c("5050320051201", "404000520051226", 
"419000820050903", "664000820050910"), class = "factor"), Date = structure(c(13118, 
13118, 13143, 13143, 13029, 13029, 13036, 13036), class = "Date"), 
Site = c("NEUTRAL", "NEUTRAL", "NEUTRAL", "NEUTRAL", "TEAM", 
"AWAY", "AWAY", "TEAM"), Points = c(32L, 25L, 23L, 42L, 37L, 
45L, 42L, 43L)), .Names = c("Team Code", "Name", "Game Code", 
"Date", "Site", "Points"), row.names = c(NA, -8L), class = "data.frame")

print(df)
##  Team Code        Name       Game Code       Date    Site Points
##1         5       Akron   5050320051201 2005-12-01 NEUTRAL     32
##2         6  St. Joseph   5050320051201 2005-12-01 NEUTRAL     25
##3         5       Akron 404000520051226 2005-12-26 NEUTRAL     23
##4         5 Miami(Ohio) 404000520051226 2005-12-26 NEUTRAL     42
##5         8     Alabama 419000820050903 2005-09-03    TEAM     37
##6         9     Florida 419000820050903 2005-09-03    AWAY     45
##7         9   Tennessee 664000820050910 2005-09-10    AWAY     42
##8         8     Alabama 664000820050910 2005-09-10    TEAM     43

你可以使用dplyr来生成你想要的:

library(dplyr)
result <- df %>% group_by(`Game Code`) %>% 
                 mutate(`Win/Loss`=if(first(Points) > last(Points)) as.integer(c(1,0)) else as.integer(c(0,1)))
print(result)
##Source: local data frame [8 x 7]
##Groups: Game Code [4]
##
##  Team Code        Name       Game Code       Date    Site Points Win/Loss
##      <int>       <chr>          <fctr>     <date>   <chr>  <int>    <int>
##1         5       Akron   5050320051201 2005-12-01 NEUTRAL     32        1
##2         6  St. Joseph   5050320051201 2005-12-01 NEUTRAL     25        0
##3         5       Akron 404000520051226 2005-12-26 NEUTRAL     23        0
##4         5 Miami(Ohio) 404000520051226 2005-12-26 NEUTRAL     42        1
##5         8     Alabama 419000820050903 2005-09-03    TEAM     37        0
##6         9     Florida 419000820050903 2005-09-03    AWAY     45        1
##7         9   Tennessee 664000820050910 2005-09-10    AWAY     42        0
##8         8     Alabama 664000820050910 2005-09-10    TEAM     43        1

在这里,我们首先group_by Game Code 然后使用mutate 为每个组创建Win/Loss 列。这里的逻辑很简单,如果firstPoints 大于last(假设只有两个),那么我们将列设置为c(1,0)。否则,我们将其设置为(0,1)。请注意,此逻辑不处理关系,但可以轻松扩展以执行此操作。另请注意,由于空格和/ 等特殊字符,我们用反引号将列名括起来。

【讨论】:

  • 完美!谢谢
【解决方案2】:

footballdata$SomeVariable[footballdata$Wins == "1"] = stuff

以 1 或 0 表示你的获胜,因此是二项式

R的数据框很好,你可以聚合你想要的东西,我只想要wins为1的数据框。然后你可以将数据设置为上面的某个变量。如果您想做另一个数据框来填充数据框,请确保它们具有相同数量的数据。

footballdata$SomeVariable[footballdata$Wins == "1"][footballdata$Team == "Browns"] = 充满希望

【讨论】:

  • 我需要创建 wins 变量...检查问题,我更新了它并且(希望)在解释我的情况方面做得更好。
猜你喜欢
  • 2018-08-25
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 2019-03-13
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多