获得自我和改变在R中的共同点

获得自我和改变在R中的共同点,r,dplyr,igraph,data-manipulation,social-networking,R,Dplyr,Igraph,Data Manipulation,Social Networking,我有一个青少年友谊的定向网络数据集。我想做一个边缘主义者,包括小我和奥尔特共同拥有的朋友数量(小我和奥尔特都被指定为朋友的人)。以下是一些示例数据: 有数据: id alter 1 3 1 5 1 9 2 3 2 5 3 2 3 5 3 9 3 6 需要数据: id alter num_common 1 3 2 1

我有一个青少年友谊的定向网络数据集。我想做一个边缘主义者,包括小我和奥尔特共同拥有的朋友数量(小我和奥尔特都被指定为朋友的人)。以下是一些示例数据:

有数据:

 id   alter
  1      3
  1      5
  1      9
  2      3
  2      5
  3      2
  3      5
  3      9
  3      6
需要数据:

 id   alter   num_common
  1      3            2
  1      5            0
  1      9            0
  2      3            1
  2      5            0
  3      2            1
  3      5            0 
  3      9            0
  3      6            0

这是一个可能但不是很简单的解决方案:

# your dummy data
df <- data.table::fread("id   alter
                          1      3
                          1      5
                          1      9
                          2      3
                          2      5
                          3      2
                          3      5
                          3      9
                          3      6")

library(dplyr)
library(tidyr)

# all pairs vertically with pair ID
pairs_v <- combn(unique(c(df$id, df$alter)), 2) %>% 
  dplyr::as_tibble() %>% 
  tidyr::pivot_longer(cols = everything()) %>% 
  dplyr::arrange(name) 

# number of comon friends per group ID
pairs_comp <- pairs_v %>% 
  dplyr::left_join(df, by = c("value" = "id"))  %>% 
  dplyr::count(name, alter) %>% 
  dplyr::filter(n > 1 & !is.na(alter)) %>% 
  dplyr::count(name) 

# all pairs horizontally with pair ID
pairs_h <-pairs_v %>% 
  dplyr::group_by(name) %>% 
  dplyr::mutate(G_ID = dplyr::row_number()) %>% 
  tidyr::pivot_wider(names_from = G_ID, values_from = "value") 

# multiple left joins to get repeated comon friends for each direction of combination
df %>% 
  dplyr::left_join(pairs_h, by = c("id" = "1", "alter" = "2")) %>% 
  dplyr::left_join(pairs_comp) %>% 
  dplyr::left_join(pairs_h, by = c("id" = "2", "alter" = "1")) %>% 
  dplyr::left_join(pairs_comp, by = c("name.y" = "name")) %>% 
  dplyr::mutate(num_common = case_when(!is.na(n.x) ~ as.numeric(n.x),
                                      !is.na(n.y) ~ as.numeric(n.y),
                                      TRUE ~ 0)) %>% 
  dplyr::select(id, alter, num_common)

      id alter num_common
  1:  1     3          2
  2:  1     5          0
  3:  1     9          0
  4:  2     3          1
  5:  2     5          0
  6:  3     2          1
  7:  3     5          0
  8:  3     9          0
  9:  3     6          0
#您的虚拟数据
df%
tidyr::pivot_更长(cols=everything())%>%
dplyr::排列(名称)
#每个组ID的好友数
配对比较%
dplyr::left_join(df,by=c(“value”=“id”))%>%
dplyr::计数(名称、更改)%%>%
dplyr::filter(n>1&!is.na(alter))%>%
dplyr::计数(名称)
#具有对ID的所有水平对
双h%
dplyr::分组依据(名称)%>%
dplyr::mutate(G_ID=dplyr::row_number())%>%
tidyr::pivot\u更宽(名称\u-from=G\u-ID,值\u-from=“值”)
#多个左连接,为每个组合方向获得重复的comon好友
df%>%
dplyr::left_join(pairs_h,by=c(“id”=“1”,“alter”=“2”))%>%
dplyr::左联合(成对合成)%>%
dplyr::left_join(pairs_h,by=c(“id”=“2”,“alter”=“1”))%>%
dplyr::left_join(pairs_comp,by=c(“name.y”=“name”))%>%
dplyr::mutate(num_common=case_,当(!is.na(n.x)~as.numeric(n.x)、,
!is.na(n.y)~as.numeric(n.y),
真~0))%>%
dplyr::select(id、alter、num_common)
id改变num_公共
1:  1     3          2
2:  1     5          0
3:  1     9          0
4:  2     3          1
5:  2     5          0
6:  3     2          1
7:  3     5          0
8:  3     9          0
9:  3     6          0

这是一个可能但不是很简单的解决方案:

# your dummy data
df <- data.table::fread("id   alter
                          1      3
                          1      5
                          1      9
                          2      3
                          2      5
                          3      2
                          3      5
                          3      9
                          3      6")

library(dplyr)
library(tidyr)

# all pairs vertically with pair ID
pairs_v <- combn(unique(c(df$id, df$alter)), 2) %>% 
  dplyr::as_tibble() %>% 
  tidyr::pivot_longer(cols = everything()) %>% 
  dplyr::arrange(name) 

# number of comon friends per group ID
pairs_comp <- pairs_v %>% 
  dplyr::left_join(df, by = c("value" = "id"))  %>% 
  dplyr::count(name, alter) %>% 
  dplyr::filter(n > 1 & !is.na(alter)) %>% 
  dplyr::count(name) 

# all pairs horizontally with pair ID
pairs_h <-pairs_v %>% 
  dplyr::group_by(name) %>% 
  dplyr::mutate(G_ID = dplyr::row_number()) %>% 
  tidyr::pivot_wider(names_from = G_ID, values_from = "value") 

# multiple left joins to get repeated comon friends for each direction of combination
df %>% 
  dplyr::left_join(pairs_h, by = c("id" = "1", "alter" = "2")) %>% 
  dplyr::left_join(pairs_comp) %>% 
  dplyr::left_join(pairs_h, by = c("id" = "2", "alter" = "1")) %>% 
  dplyr::left_join(pairs_comp, by = c("name.y" = "name")) %>% 
  dplyr::mutate(num_common = case_when(!is.na(n.x) ~ as.numeric(n.x),
                                      !is.na(n.y) ~ as.numeric(n.y),
                                      TRUE ~ 0)) %>% 
  dplyr::select(id, alter, num_common)

      id alter num_common
  1:  1     3          2
  2:  1     5          0
  3:  1     9          0
  4:  2     3          1
  5:  2     5          0
  6:  3     2          1
  7:  3     5          0
  8:  3     9          0
  9:  3     6          0
#您的虚拟数据
df%
tidyr::pivot_更长(cols=everything())%>%
dplyr::排列(名称)
#每个组ID的好友数
配对比较%
dplyr::left_join(df,by=c(“value”=“id”))%>%
dplyr::计数(名称、更改)%%>%
dplyr::filter(n>1&!is.na(alter))%>%
dplyr::计数(名称)
#具有对ID的所有水平对
双h%
dplyr::分组依据(名称)%>%
dplyr::mutate(G_ID=dplyr::row_number())%>%
tidyr::pivot\u更宽(名称\u-from=G\u-ID,值\u-from=“值”)
#多个左连接,为每个组合方向获得重复的comon好友
df%>%
dplyr::left_join(pairs_h,by=c(“id”=“1”,“alter”=“2”))%>%
dplyr::左联合(成对合成)%>%
dplyr::left_join(pairs_h,by=c(“id”=“2”,“alter”=“1”))%>%
dplyr::left_join(pairs_comp,by=c(“name.y”=“name”))%>%
dplyr::mutate(num_common=case_,当(!is.na(n.x)~as.numeric(n.x)、,
!is.na(n.y)~as.numeric(n.y),
真~0))%>%
dplyr::select(id、alter、num_common)
id改变num_公共
1:  1     3          2
2:  1     5          0
3:  1     9          0
4:  2     3          1
5:  2     5          0
6:  3     2          1
7:  3     5          0
8:  3     9          0
9:  3     6          0

解决方案可以是将edgelist转换为邻接矩阵(使用igraph软件包),并通过转置将其乘以,以计算共享邻居的数量:

el <- read.table(text= " id   alter
  1      3
  1      5
  1      9
  2      3
  2      5
  3      2
  3      5
  3      9
  3      6", header =T)

g <- graph_from_edgelist(as.matrix(el), directed = T)
m <- get.adjacency(g, sparse = F)
m2 <- m %*% t(m)           

el解决方案可以是将edgelist转换为邻接矩阵(使用igraph软件包),并通过转置将其乘以,以计算共享邻居的数量:

el <- read.table(text= " id   alter
  1      3
  1      5
  1      9
  2      3
  2      5
  3      2
  3      5
  3      9
  3      6", header =T)

g <- graph_from_edgelist(as.matrix(el), directed = T)
m <- get.adjacency(g, sparse = F)
m2 <- m %*% t(m)           

el您可以使用
bibcoupling(g)
,它返回一个包含常用引用朋友数的矩阵,而不是获取邻接并手动执行乘法。类似地,如果我们对常见引用的数量感兴趣,我们可以使用
cocitation
注意,这并不完全相同,因为对角线上的数字(循环的常见朋友,如果有的话)。您可以使用
bibcoupling(g)代替获取邻接和手动乘法
,返回一个矩阵,其中包含引用的常见好友数。类似地,如果我们对常见引用的数量感兴趣,我们可以使用
cocitation
注意,这并不完全相同,因为对角线上的数字(循环的常见朋友,如果有的话)。