比较 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 和 /
.
等特殊字符,我们用反引号将列名括起来
我有一个 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 和 /
.