我已经包含了一个数据框,它描述了我正在使用的数据的一小部分。我的目标是构建一个交互式网络,因为数据中有大量节点。
library(networkD3)
screenName <- c("ZV8Lxypirmo2T8z", "Zwoodbutcher", "zX3GZYH7Ea5FKhx", "zXZK7fkzrpPpJdb",
"ZyaTheKing", "zzzcccbbbmmm")
mention <- c("GianCavallotto:", "IanPTrait:", "JahovasWitniss:", "Veachtravis:",
"visecs:", "Charles_HRH:")
n <- c(1L, 1L, 1L, 1L, 1L, 1L)
data <- data.frame(screenName,mention,n)
simpleNetwork(data)
上述代码允许构建交互式无向网络图。我遇到了forceNetwork()
R库下的networkD3
函数,这可能对此有所帮助。但我真的不知道如何转换data.frame以用于此函数。提前谢谢!
答案 0 :(得分:1)
让我用文档中的例子来解释。
您需要两个数据框 - links
和nodes
。
data(MisLinks)
glimpse(MisLinks)
#Observations: 254
#Variables: 3
#$ source <int> 1, 2, 3, 3, 4, 5, 6, 7, 8, 9, 11, 11, 11, 11, 12, 13, 14, 15, 17, 18, 18, 19, 19, 1...
#$ target <int> 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 10, 3, 2, 0, 11, 11, 11, 11, 16, 16, 17, 16, 17, 18, ...
#$ value <int> 1, 8, 10, 6, 1, 1, 1, 1, 2, 1, 1, 3, 3, 5, 1, 1, 1, 1, 4, 4, 4, 4, 4, 4, 3, 3, 3, 4...
length(unique(c(MisLinks$source,MisLinks$target)))
#[1] 77
data(MisNodes)
glimpse(MisNodes)
#Observations: 77
#Variables: 3
#$ name <fctr> Myriel, Napoleon, Mlle.Baptistine, Mme.Magloire, CountessdeLo, Geborand, Champterci...
#$ group <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 5, 4, ...
#$ size <int> 15, 20, 23, 30, 11, 9, 11, 30, 8, 29, 29, 9, 18, 12, 16, 22, 21, 11, 19, 10, 8, 13, ...
source
数据框的target
和links
中的每个条目都是一个节点(整数0,1,...,n)。在这种情况下,有77个唯一节点。因此,您需要一个nodes
数据框,其中77个节点描述节点属性。 nodes
数据框中的第一个条目是节点0
,下一个条目是节点1
,依此类推。必须根据此序列对nodes
数据帧进行排序。这是将nodes
数据框与links
数据框绑定的唯一方法。
# Create graph
forceNetwork(Links = MisLinks, Target = "target", Value = "value",
Nodes = MisNodes, Source = "source", NodeID = "name", Group = "group",
opacity = 0.4, zoom = TRUE)
答案 1 :(得分:1)
函数simpleNetwork()
和forceNetwork()
的设计工作方式不同。
simpleNetwork()
将一个数据框作为其主要输入,默认情况下假设第一列是每个链接的“源”,第二列是每个链接的“目标”。它不需要描述节点的数据帧,因为它假定唯一的节点是链接到链接数据帧中某些节点的节点,并通过确定链接数据框中的唯一值在内部创建节点列表。
forceNetwork()
功能更强大,更灵活,但它要求您传递两个数据帧,一个用于链接,另一个用于节点。您将参数Nodes
传递给包含唯一节点列表的数据框。参数NodeID
和Group
是用于定义包含该信息的节点数据帧中列的名称的字符值,例如, NodeID = 'name'
和Group = 'type'
。节点数据框中的Group
列用于定义节点的颜色,并不是必需的,但forceNetwork()
需要它,因此您只需在节点数据框中创建一个列即可每行具有相同的值,例如1
。
您可以使用上面的代码,并构建必要的数据框以使用forceNetwork()
这样的(例如)...
library(networkD3)
screenName <- c("ZV8Lxypirmo2T8z", "Zwoodbutcher", "zX3GZYH7Ea5FKhx",
"zXZK7fkzrpPpJdb", "ZyaTheKing", "zzzcccbbbmmm")
mention <- c("GianCavallotto:", "IanPTrait:", "JahovasWitniss:", "Veachtravis:",
"visecs:", "Charles_HRH:")
n <- c(1L, 1L, 1L, 1L, 1L, 1L)
nodeFactors <- factor(sort(unique(c(screenName, mention))))
nodes <- data.frame(name = nodeFactors, group = 1)
screenName <- match(screenName, levels(nodeFactors)) - 1
mention <- match(mention, levels(nodeFactors)) - 1
links <- data.frame(screenName, mention, n)
forceNetwork(Links = links, Nodes = nodes, Source = 'screenName',
Target = 'mention', Value = 'n', NodeID = 'name', Group = 'group')