首页 > 解决方案 > 将 2 个数据框组合在一起,将一个社交网络创建为 R 中的 1 个更大的数据框

问题描述

所以,我目前有两个数据框。一个包含给定网络的节点信息,它看起来像这样:

id age
01  14
02  23
03  52
04  41
05  32

另一个数据框包含节点之间连接的信息,如下所示:

id1 id2
01  02
01  05
03  04
05  02

因此,鉴于这两个数据框,我想要做的是以这样的方式组合它们,使得生成的数据框看起来像第一个,但现在对于节点具有的每个连接都有列以及包含连接数的列该节点有(假设它从不超过5)。所以它看起来像这样:

id age  friend1 friend2  Connections
01  14  02     05        2
02  23  01     05        2
03  52  04               1
04  41  03               1
05  32  01     02        2  

标签: r

解决方案


将第二个 data.frame 转换为邻接矩阵可能会更好。

# DATA
df1 = structure(list(id = c("01", "02", "03", "04", "05"), age = c(14, 
23, 52, 41, 32)), class = "data.frame", row.names = c(NA, -5L))

df2 = structure(list(id1 = c("01", "01", "03", "05"), id2 = c("02", 
"05", "04", "02")), class = "data.frame", row.names = c(NA, -4L))

library(igraph)
g = graph.data.frame(df2)
m = as.matrix(get.adjacency(g))
m
#   01 03 05 02 04
#01  0  0  1  1  0
#03  0  0  0  0  1
#05  0  0  0  1  0
#02  0  0  0  0  0
#04  0  0  0  0  0

pmax(rowSums(m), colSums(m)) #Total Connections
#01 03 05 02 04 
# 2  1  1  2  1

#Add a column for age
mydat = as.data.frame(m)
mydat$id = row.names(mydat)
merge(mydat, df1, by = "id")
#  id 01 03 05 02 04 age
#1 01  0  0  1  1  0  14
#2 02  0  0  0  0  0  23
#3 03  0  0  0  0  1  52
#4 04  0  0  0  0  0  41
#5 05  0  0  0  1  0  32

推荐阅读