这是一个简单的R任务。我列出了一些有ID的人和每个人的朋友列表(也有ID)。他们在这里:
> dput(friends_of_people)
structure(list(`7614` = c(1091, 1252, 1827, 34687), `29752` = c(1419,
1799, 3353, 4665), `33220` = c(143, 297, 436, 52078), `34687` = c(14,
17, 34, 70, 161, 7614), `52078` = c(58, 66, 99, 184, 33220)), .Names = c("7614",
"29752", "33220", "34687", "52078"))
> dput(people)
c(7614L, 29752L, 33220L, 34687L, 52078L)
我想从这些列表中提取朋友关系以构建朋友网络。为此,我需要创建一个NxN矩阵,其中N - 人数,单元格中的0(i,j)表示我不是人j的朋友,反之亦然(单元格j,i,在这种情况下,也包含0)。如果他们是朋友(在人j的朋友列表中有人i的ID,反之亦然),则该单元格将包含1。 最终结果应该是这样的:
> result
7614 29752 33220 34687 52078
7614 0 0 0 1 0
29752 0 0 0 0 0
33220 0 0 0 0 1
34687 1 0 0 0 0
52078 0 0 1 0 0
注意实际任务中的节点数是几千,而每个人的朋友数也是几千,所以我担心性能。我知道这可能是一件容易的事,但不知道从哪里开始。非常感谢任何帮助。
答案 0 :(得分:3)
您也可以尝试
edges <- stack(lapply(friends_of_people, intersect, x=people)[as.character(people)])
result <- with(edges, table(factor(values, levels=people), factor(ind, levels=people)))
result
# 7614 29752 33220 34687 52078
# 7614 0 0 0 1 0
# 29752 0 0 0 0 0
# 33220 0 0 0 0 1
# 34687 1 0 0 0 0
# 52078 0 0 1 0 0
答案 1 :(得分:1)
您可以遍历列表中的每个元素,并检查people
中的条目。
# Matrix filled with 0
# We assume that there's no connection between people
res <- matrix(0, length(people), length(people))
colnames(res) <- rownames(res) <- people
# For every element in list
for(i in seq_along(friends_of_people)) {
# Which entries overlap with people vector
foo <- people %in% friends_of_people[[I]]
# Change status
res[i, which(foo)] <- 1
}
res