比较来自不同行

时间:2016-09-06 20:16:39

标签: r loops dataframe match lookup

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

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

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。

2 个答案:

答案 0 :(得分: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列。这里的逻辑很简单,如果first Points大于last(假设只有两个),那么我们将列设置为c(1,0)。否则,我们将其设置为(0,1)。请注意,此逻辑不处理关系,但可以轻松扩展以执行此操作。另请注意,由于空格和/等特殊字符,我们使用反引号括起列名称。

答案 1 :(得分:0)

footballdata $ SomeVariable [footballdata $ Wins ==&#34; 1&#34;] = stuff

通过1或0调用你的胜利,因此二项式

R的数据框很好,因为你可以聚合你想要的东西,我只希望带有胜利的数据帧是1.然后你可以将数据设置为某个变量,如上所述。如果您想要另一个数据框来填充数据框,请确保它们具有相同数量的数据。

footballdata $ SomeVariable [footballdata $ Wins ==&#34; 1&#34;] [footballdata $ Team ==&#34; Browns&#34;] = Hopeful