我有两列数据:交易ID和销售人员名称,其中一行代表交易以及处理该交易的销售人员。大多数交易具有超过1个销售人员,因此在这种情况下,交易ID重复列出所有销售人员。
我想使用r中的网络包创建一个网络,但是在如何格式化数据方面陷入了困境。我可以通过对名称进行唯一排序来获取节点,但不确定如何转换数据以获取边缘列表。网络是无向的。
我的数据如下:
Trans_ID | Name
--------------------
1 | Andy
1 | Ben
1 | Cindy
2 | David
2 | Eric
3 | Fabian
3 | George
4 | Hector
真实数据大约有30万行数据。
答案 0 :(得分:0)
您可以加入Trans_ID
来创建边缘:
library(dplyr)
library(visNetwork)
data <- tibble::tribble(~Trans_ID , ~Name,
1 , "Andy",
1 , "Ben",
1 , "Cindy",
2 , "David",
2 , "Eric",
3 , "Fabian",
3 , "George",
4 , "Hector")
nodes <- data %>% select(Name) %>% unique() %>% mutate(id = Name, label = Name)
edges <- data %>% inner_join(data, by = c("Trans_ID"="Trans_ID")) %>%
filter(Name.x < Name.y) %>%
mutate(from = Name.x, to = Name.y)
vn <- visNetwork(nodes, edges, height = 1200,width = "100%") %>% visPhysics(stabilization = FALSE,solver='forceAtlas2Based')
vn
答案 1 :(得分:0)
我不确定您将基于给定的数据帧来说明哪种网络。这是使用igraph
的选项:
Name
关联的图Trans_ID
library(igraph)
g <- graph_from_data_frame(df,directed = FALSE)
V(g)$color <- c("light blue","yellow")[V(g)$name %in% df$Trans_ID + 1]
plot(g,vertex.size = 30)
给予
Name
(按Trans_ID
分组)library(igraph)
DF <- as.data.frame(do.call(rbind,
with(df,tapply(Name, Trans_ID, function(x) if (length(x)==1) t(rep(x,2)) else t(combn(x,2)) ))))
g <- graph_from_data_frame(DF,directed = FALSE)
plot(simplify(g),vertex.size = 30)