获得自我和改变在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
注意,这并不完全相同,因为对角线上的数字(循环的常见朋友,如果有的话)。