R 如何制作邻接表
我有类似的数据R 如何制作邻接表,r,igraph,adjacency-matrix,chord-diagram,R,Igraph,Adjacency Matrix,Chord Diagram,我有类似的数据 mydf <- data.frame(p1=c('a','a','a','b','b','b','c','c','d'), p2=c('b','c','d','c','d','e','d','e','e'), p3=c('a','a','c','c','d','d','d','a','a'), p4=c('a','a','b','c','c','e','d','
mydf <- data.frame(p1=c('a','a','a','b','b','b','c','c','d'),
p2=c('b','c','d','c','d','e','d','e','e'),
p3=c('a','a','c','c','d','d','d','a','a'),
p4=c('a','a','b','c','c','e','d','a','b'),
p5=c('a','b','c','d','e','b','b','c','c'),
source=c('a','b','c','d','e','e','a','b','d'))
我想创建两个邻接矩阵,作为源列到rest列之间的连接数。例如:
a b c d e
a 4 2
b 5 1
c 1 1
d 1 2
e 0 3
有什么方法可以轻松地做到这一点吗。如果您对base R有任何帮助,我们将不胜感激。我们可以使用unlist和table:
另一种方法是获取长格式的数据,根据源进行计数,然后再次获取宽格式的数据
library(dplyr)
library(tidyr)
mydf %>%
pivot_longer(cols = -source) %>%
count(source, value) %>%
pivot_wider(names_from = value, values_from = n, values_fill = list(n = 0))
# source a b c d e
# <fct> <int> <int> <int> <int> <int>
#1 a 4 2 1 3 0
#2 b 5 1 3 0 1
#3 c 1 1 2 1 0
#4 d 1 2 4 2 1
#5 e 0 3 1 3 3
df[1:2]将为col1和col2生成一个固定的差异:行名和列名是a-f,但您的col1列不在输出中。但是如果没有set.seed,我真的不能确定。你能检查一下修改过的问题吗@Ronakshah对不起,有一个错误,我现在改正了。我从源代码到rest列进行计数。例如,在a到a中,第1行列中的a到a之间有四个单向连接—p1、p3、p4和p5,其余行中没有。在第二行a到b中,有五个单向连接行2、列p1、p3和p4,加上行8、列p3和p4。希望现在一切都清楚了@谢谢。我接受了你的回答@Ronakshah代码在示例数据中运行良好。当我在大数据中使用代码时,我没有得到邻接表。与示例不同,列名是数字而不是字符串。邻接矩阵的行和列应该相等。非常感谢您的帮助@ronak Shah请分享代表您实际数据的示例,以便更容易提供帮助。谢谢。这里有数据>上面说链接过期了。奇怪。请在此处查找数据[链接]“代码”NA表示没有数据
table(rep(mydf$source, ncol(mydf) - 1), unlist(mydf[-ncol(mydf)]))
# a b c d e
# a 4 2 1 3 0
# b 5 1 3 0 1
# c 1 1 2 1 0
# d 1 2 4 2 1
# e 0 3 1 3 3
library(dplyr)
library(tidyr)
mydf %>%
pivot_longer(cols = -source) %>%
count(source, value) %>%
pivot_wider(names_from = value, values_from = n, values_fill = list(n = 0))
# source a b c d e
# <fct> <int> <int> <int> <int> <int>
#1 a 4 2 1 3 0
#2 b 5 1 3 0 1
#3 c 1 1 2 1 0
#4 d 1 2 4 2 1
#5 e 0 3 1 3 3