r从邻接列表创建邻接矩阵或边列表
我有一个邻接列表,我试图把它变成邻接矩阵或边列表。这是为了对由邻接矩阵或边列表构建的网络进行网络分析。我用的是R。 邻接列表的示例如下(每行有不同数量的条目,空条目为NA): 我尝试使用,但这只适用于我的邻接列表有两个条目(即一个组中有两个以上的邻居)的情况。我得到了一个边缘列表,但只考虑了列表中的前两个条目 我还尝试使用但使用了r从邻接列表创建邻接矩阵或边列表,r,networking,igraph,adjacency-matrix,adjacency-list,R,Networking,Igraph,Adjacency Matrix,Adjacency List,我有一个邻接列表,我试图把它变成邻接矩阵或边列表。这是为了对由邻接矩阵或边列表构建的网络进行网络分析。我用的是R。 邻接列表的示例如下(每行有不同数量的条目,空条目为NA): 我尝试使用,但这只适用于我的邻接列表有两个条目(即一个组中有两个以上的邻居)的情况。我得到了一个边缘列表,但只考虑了列表中的前两个条目 我还尝试使用但使用了igraph和make\u graph(unlist(mydata))导致错误:“At type\u indexedgelist.c:117:无法创建顶点数为负数的空图
igraph
和make\u graph(unlist(mydata))
导致错误:“At type\u indexedgelist.c:117:无法创建顶点数为负数的空图,无效值”
我需要一个邻接矩阵,它考虑到网络中的权重(比如,如果条目31和32在两行中,那么它们的边权重将是2)。
谢谢你的帮助
我有一个邻接列表,我正试图把它变成一个[…]边列表
也许你可以
lst <- read.csv(header=F, comment.char=";", colClasses="integer", text="
17,50,90,NA,NA;
80,67,NA,NA,NA;
33,31,32,NA,NA;
33,31,32,NA,NA;
354,56,87,97,32;")
m <- as.matrix(lst)
e <- stack(split(m, row(m)))[,2:1]
(e <- e[complete.cases(e),])
# 1 1 17
# 2 1 50
# 3 1 90
# 6 2 80
# 7 2 67
# 11 3 33
# 12 3 31
# 13 3 32
# 16 4 33
# 17 4 31
# 18 4 32
# 21 5 354
# 22 5 56
# 23 5 87
# 24 5 97
# 25 5 32
lst
我有一个邻接列表,我正试图把它变成一个[…]边列表
也许你可以
lst <- read.csv(header=F, comment.char=";", colClasses="integer", text="
17,50,90,NA,NA;
80,67,NA,NA,NA;
33,31,32,NA,NA;
33,31,32,NA,NA;
354,56,87,97,32;")
m <- as.matrix(lst)
e <- stack(split(m, row(m)))[,2:1]
(e <- e[complete.cases(e),])
# 1 1 17
# 2 1 50
# 3 1 90
# 6 2 80
# 7 2 67
# 11 3 33
# 12 3 31
# 13 3 32
# 16 4 33
# 17 4 31
# 18 4 32
# 21 5 354
# 22 5 56
# 23 5 87
# 24 5 97
# 25 5 32
l非常感谢。对于使用apply的第二个答案,是否有任何方法也可以将第一个和第三个条目列为邻居?例如,第三行是值[17,90]。对于其他条目,如列出“我的数据”中的第一个和第八个条目,此操作将继续。@CatalinaGutierrez您可能希望签出?expand.grid()
和/或?combn()
。忽略最后的注释。更新:我尝试使用comb byco=combn(e[[1]],2)
其中e来自apply。我转换为data.frame并使用转置得到边缘列表:[17,50;17,90;50,90]。我能够对所有的值执行此操作,并得到一个完整的边缘列表。但是,当把它转换成一个图和邻接矩阵时,我相信它会重新计算任何重复的对。我需要把它转换成加权邻接矩阵和图。例如,如果[17,50]在我的边列表中出现两次,这意味着17和50之间的边的权重是2。有什么想法吗?再次感谢你@CatalinaGutierrez请查看igraph::simplify()
,以聚合多个边。非常感谢。对于使用apply的第二个答案,是否有任何方法也可以将第一个和第三个条目列为邻居?例如,第三行是值[17,90]。对于其他条目,如列出“我的数据”中的第一个和第八个条目,此操作将继续。@CatalinaGutierrez您可能希望签出?expand.grid()
和/或?combn()
。忽略最后的注释。更新:我尝试使用comb byco=combn(e[[1]],2)
其中e来自apply。我转换为data.frame并使用转置得到边缘列表:[17,50;17,90;50,90]。我能够对所有的值执行此操作,并得到一个完整的边缘列表。但是,当把它转换成一个图和邻接矩阵时,我相信它会重新计算任何重复的对。我需要把它转换成加权邻接矩阵和图。例如,如果[17,50]在我的边列表中出现两次,这意味着17和50之间的边的权重是2。有什么想法吗?再次感谢你@CatalinaGutierrez签出igraph::simplify()
以聚合多条边。
e <- apply(lst, 1, function(x)x[!is.na(x)])
(e <- do.call(rbind, lapply(e, embed, 2))[,2:1])
# [,1] [,2]
# [1,] 17 50
# [2,] 50 90
# [3,] 80 67
# [4,] 33 31
# [5,] 31 32
# [6,] 33 31
# [7,] 31 32
# [8,] 354 56
# [9,] 56 87
# [10,] 87 97
# [11,] 97 32