为成对相关安排数据帧

时间:2014-10-13 18:44:56

标签: r dataframe correlation

我正在使用以下格式的数据:

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) 

获取每位玩家的目标数量,但是如何生成这些成对组合?

2 个答案:

答案 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.xPlayer.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

如果我们制作了一些数据副本并重命名了dplyrPlayer列,那么可以在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