1

我已经包含了一个数据框,它描述了我正在使用的数据的一个非常小的子集。由于数据中有大量节点,我的目标是构建一个交互式网络。

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)

上面的代码允许构建交互式无向网络图。我遇到了R 库forceNetwork()下的函数,这可能对这里有所帮助。networkD3但我真的不知道如何转换 data.frame 以便在此函数中使用它。先感谢您!

4

2 回答 2

1

让我用文档中的示例进行解释。

您需要两个数据框 -linksnodes.

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 个节点的数据框来描述节点属性。nodesdataframe 中的第一个条目是 node 0,下一个条目是 node 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)
于 2017-02-19T07:21:23.493 回答
1

功能simpleNetwork()forceNetwork()旨在以不同的方式工作。

simpleNetwork()将一个数据框作为主要输入,默认情况下假定第一列是每个链接的“源”,第二列是每个链接的“目标”。它不需要描述节点的数据框,因为它假设唯一的节点是链接到链接数据框中的某些内容的节点,并通过确定链接数据框中的唯一值在内部创建节点列表。

forceNetwork()更加强大和灵活,但它需要您传递两个数据帧,一个用于链接,一个用于节点。Nodes您将包含唯一节点列表的数据框传递给参数。参数NodeIDGroup是字符值,用于定义节点数据框中包含该信息的列的名称,例如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')
于 2017-02-19T09:25:11.653 回答