Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
r从邻接列表创建邻接矩阵或边列表_R_Networking_Igraph_Adjacency Matrix_Adjacency List - Fatal编程技术网

r从邻接列表创建邻接矩阵或边列表

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:无法创建顶点数为负数的空图

我有一个邻接列表,我试图把它变成邻接矩阵或边列表。这是为了对由邻接矩阵或边列表构建的网络进行网络分析。我用的是R。 邻接列表的示例如下(每行有不同数量的条目,空条目为NA):

我尝试使用,但这只适用于我的邻接列表有两个条目(即一个组中有两个以上的邻居)的情况。我得到了一个边缘列表,但只考虑了列表中的前两个条目

我还尝试使用但使用了
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 by
co=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 by
co=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