2016-08-23 78 views
2

我在R中的“visNetwork”包的新用户,我想知道的方式来改变长data.frame成visnetworkR:改变一个数据帧到visnetwork

我有这个那种数据框中的:

data<-data.frame(link=c("A","A","B","B","C","C","D","D","E","E"),node=c("Alpha","Beta","Gamma","Delta","Alpha","Delta","Gamma","Beta","Alpha","Beta"), 
     sign=c(1,-1)) 

    link node sign 
1  A Alpha 1 
2  A Beta -1 
3  B Gamma 1 
4  B Delta -1 
5  C Alpha 1 
6  C Delta -1 
7  D Gamma 1 
8  D Beta -1 
9  E Alpha 1 
10 E Beta -1 

我的目标是把它在一个“visnetwork”像这样的:

library(visNetwork) 
nodes <- data.frame(id = c("Alpha","Beta","Gamma","Delta"), 
       label=c("Alpha","Beta","Gamma","Delta")) 
edges <- data.frame(from = c("Alpha","Beta","Delta","Delta"), to = c("Beta","Gamma","Gamma","Alpha"), 
       label=c("A+E","D","B","C"), 
       arrows="middle") 
visNetwork(nodes, edges) %>% 
    visOptions(nodesIdSelection = TRUE) 

不知道如何做呢?

我所到目前为止已经试过:

nodes <- data.frame(id=c(distinct(data,as.character(node))), 
       label=c(distinct(data,as.character(node)))) 
colnames(nodes)[1]<-"id" 
colnames(nodes)[2]<-"label" 

edges<-tbl_df(data) %>% 
    group_by(link) %>% 
    arrange(node) %>% 
    summarise(nodes = paste(node, collapse =",")) %>% 
    arrange(nodes) %>% 
    separate(nodes,c("from","to"),sep=",") %>% 
    mutate(label=as.character(link)) %>% 
    mutate(arrows="middle") 

visNetwork(nodes, edges) 

回答

3

您需要visNetwork两个表,一个节点,一个用于链接。

从您的data例子开始,节点表可以简单地作为节点的名称,我也给它们ID。

data <- data.frame(link=c("A","A","B","B","C","C","D","D","E","E"), node=c("Alpha","Beta","Gamma","Delta","Alpha","Delta","Gamma","Beta","Alpha","Beta"), sign=c(1,-1)) 

nodes.df = data.frame(id = 1:length(unique(data$node)), label = sort(unique(data$node))) 

的联系是因为你需要收集您data表,使每一行成为从节点A到节点B的链接更难

使用dplyr与远离优雅的解决方案:

library(dplyr) 
temp.links = as.character(unique(data$link)) 
# Iterate through link names i.e. A, B... 
# and generate a data.frame of link name, from here to there 
links.df = data.frame(t(sapply(temp.links, function(x) c(x, unlist(select(filter(data, link == x), node)))))) 
# set the names 
colnames(links.df) = c('label', 'from', 'to') 
# default width to 1 to aggregate next 
links.df$width = 1 
# Aggregate links with the same from and to values by summing width and combining labels 
links.df = merge(aggregate(width ~ from + to , links.df , sum), aggregate(label ~ from + to, links.df, function(x) paste0(x, collapse=' + '))) 

现在,我们有我们的nodes.dflinks.df,我们已经准备好绘制

visNetwork(nodes.df, links.df) %>% visLayout(randomSeed = 123) 

例类似于期望:

example

如果你的数据是很长,聚集加入一串连接两个节点则标签命名链接+ B + C会很长。我个人不喜欢用名字来标记边缘/链接,而不是边缘的宽度或重量。