比较 data.frame 中不同行的值

Compare values in data.frame from different rows

我有一个 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。

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

你赢了 1 或 0,因此是二项式的

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

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

假设您的数据中每个唯一 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)。请注意,此逻辑不处理关系,但可以轻松扩展以执行此操作。另请注意,由于 space 和 /.

等特殊字符,我们用反引号将列名括起来