我正在使用以下格式的数据:
Country Player Goals
"USA" "Tim" 0
"USA" "Tim" 0
"USA" "Dempsey" 3
"USA" "Dempsey" 5
"Brasil" "Neymar" 6
"Brasil" "Neymar" 2
"Brasil" "Hulk" 5
"Brasil" "Luiz" 2
"England" "Rooney" 4
"England" "Stewart" 2
每一行代表一名玩家每场比赛得分的目标数,并且还包含该玩家的国家/地区。我想在表格中包含数据,以便我可以运行成对相关性,以查看来自同一个国家/地区是否与玩家得分的目标数量有某种关联。数据看起来像这样:
Player_1 Player_2
0 8 # Tim Dempsey
8 5 # Neymar Hulk
8 2 # Neymar Luiz
5 2 # Hulk Luiz
4 2 # Rooney Stewart
(您可以忽略这些评论,它们只是为了澄清每行包含的内容)。
我该怎么做?
table(df$player)
获取每位玩家的目标数量,但是如何生成这些成对组合?
答案 0 :(得分:3)
这是一个非常经典的自我加入问题。我将首先总结您的数据,以获得每个玩家的总目标。我喜欢dplyr
,但聚合或data.table
工作得很好。
library(dplyr)
df <- df %>% group_by(Player, Country) %>% dplyr::summarize(Goals = sum(Goals))
> df
Source: local data frame [7 x 3]
Groups: Player
Player Country Goals
1 Dempsey USA 8
2 Hulk Brasil 5
3 Luiz Brasil 2
4 Neymar Brasil 8
5 Rooney England 4
6 Stewart England 2
7 Tim USA 0
然后,使用良好的旧合并,我们根据国家加入它自己,然后我们不会得到每一行两次(Dempsey,Tim和Tim,Dempsey ---更不用说Dempsey,Dempsey),我们'll它,以便Player.x
在Player.y
之前按字母顺序排列。由于我已加载dplyr
,我将使用filter
,但subset
会做同样的事情。
df2 <- merge(df, df, by.x = "Country", by.y = "Country")
df2 <- filter(df2, as.character(Player.x) < as.character(Player.y))
> df2
Country Player.x Goals.x Player.y Goals.y
2 Brasil Hulk 5 Luiz 2
3 Brasil Hulk 5 Neymar 8
6 Brasil Luiz 2 Neymar 8
11 England Rooney 4 Stewart 2
15 USA Dempsey 8 Tim 0
如果我们制作了一些数据副本并重命名了dplyr
和Player
列,那么可以在Goals
中完成自我加入,以便它们不会被加入。由于merge
对于重命名非常聪明,因此在这种情况下更容易。
答案 1 :(得分:1)
可能有一种更聪明的方法可以从汇总数据中获取对,但假设您的数据不是太大(国家足球数据),您可以随时执行以下操作:
A<-aggregate(df$Goals~df$Player+df$Country,data=df,sum)
players_in_c<-table(A[,2])
dat<-NULL
for(i in levels(df$Country)) {
count<-players_in_c[i]
pair<-combn(count,m=2)
B<-A[A[,2]==i,]
dat<-rbind(dat, cbind(B[pair[1,],],B[pair[2,],]) )
}
dat
> dat
df$Player df$Country df$Goals df$Player df$Country df$Goals
1 Hulk Brasil 5 Luiz Brasil 2
1.1 Hulk Brasil 5 Neymar Brasil 8
2 Luiz Brasil 2 Neymar Brasil 8
4 Rooney England 4 Stewart England 2
6 Dempsey USA 8 Tim USA 0