我如何在 R 中创建 data.frame 玩家在游戏中一起开始的次数

How can I create a data.frame in R of how many times players start together in games

我刚开始研究网络分析,想从创建一个 data.frame 团队中篮球运动员一起首发的频率开始

理想情况下,我想合并来自 purrr

的地图函数

所以以此为输入

game_1 <- c("Andy","Bob","Chris","Doug","Evan") 
game_2 <- c("Andy","Chris","Evan","Fred","George")  

我想要这样的结果

n_1  n_2 games

Andy  Bob    1
Andy  Chris  2
Andy  Doug   1
Andy  Evan   2
Andy  Fred   1
Andy  George 1
Bob   Chris  1
Bob   Doug   1
Bob   Evan   1
Chris Doug   1
Chris Evan   2
Chris Fred   1
Chris George 1
Doug  Evan   1
Evan  Fred   1
Evan  George 1
Fred  George 1

我的解决方案没有使用 purrr,但它应该有效

game_1 <- c("Andy","Bob","Chris","Doug","Evan") 
game_2 <- c("Andy","Chris","Evan","Fred","George")

# Combine all games into a single list for use with lapply
all_games <- list(game_1, game_2)

library(dplyr)

# Find combinations, sorted to ensure the earlier alphabets are in the first column
df <- do.call(rbind, lapply(all_games, function(x) { data.frame(t(combn(sort(x), 2)))  })) 

# Calculate the number of instances where 2 players appear with each other
df %>% group_by(X1, X2) %>% summarise(count = n())
# A tibble: 17 x 3
# Groups:   X1 [?]
# X1     X2 count
# <fctr> <fctr> <int>
#   1   Andy    Bob     1
# 2   Andy  Chris     2
# 3   Andy   Doug     1
# 4   Andy   Evan     2
# 5   Andy   Fred     1
# 6   Andy George     1
# 7    Bob  Chris     1
# 8    Bob   Doug     1
# 9    Bob   Evan     1
# 10  Chris   Doug     1
# 11  Chris   Evan     2
# 12  Chris   Fred     1
# 13  Chris George     1
# 14   Doug   Evan     1
# 15   Evan   Fred     1
# 16   Evan George     1
# 17   Fred George     1
library(dplyr)

# get combinations from game_1
g1 <- combn(game_1, 2) %>% t 

# get combinations from game_2
g2 <- combn(game_2, 2) %>% t 

# bind both in a dataframe and count pairs
g1 %>% 
  rbind.data.frame(g2) %>% 
  group_by(V1, V2) %>% 
  summarise(games = n())

# A tibble: 17 x 3
# Groups:   V1 [?]
       V1     V2 games
   <fctr> <fctr> <int>
 1   Andy    Bob     1
 2   Andy  Chris     2
 3   Andy   Doug     1
 4   Andy   Evan     2
 5   Andy   Fred     1
 6   Andy George     1
 7    Bob  Chris     1
 8    Bob   Doug     1
 9    Bob   Evan     1
10  Chris   Doug     1
11  Chris   Evan     2
12  Chris   Fred     1
13  Chris George     1
14   Doug   Evan     1
15   Evan   Fred     1
16   Evan George     1
17   Fred George     1

基于 whalea 的回答:

game_1 <- c("Andy","Bob","Chris","Doug","Evan") 
game_2 <- c("Andy","Chris","Evan","Fred","George")

all_games <- list(game_1, game_2)

library(dplyr)
df <- do.call(rbind, lapply(all_games, function(x) { expand.grid(x, x) %>% filter(Var1 != Var2) })) %>% apply(1,sort) %>% t %>% data.frame
df %>% group_by(X1, X2) %>% summarise(count = n()/2)

结果:

 1 Andy  Bob       1.
 2 Andy  Chris     2.
 3 Andy  Doug      1.
 4 Andy  Evan      2.
 5 Andy  Fred      1.
 6 Andy  George    1.
 7 Bob   Chris     1.
 8 Bob   Doug      1.
 9 Bob   Evan      1.
10 Chris Doug      1.
11 Chris Evan      2.
12 Chris Fred      1.
13 Chris George    1.
14 Doug  Evan      1.
15 Evan  Fred      1.
16 Evan  George    1.
17 Fred  George    1.