我如何在 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.
我刚开始研究网络分析,想从创建一个 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.