r - 从表中自动获取 sankey 图表的节点和链接
问题描述
绘制 sankey 图需要节点和链接。要从数据框中获取节点和链接,可以使用例如 plyr 包中的计数函数并将其用于每个节点来计算邻居之间的链接,但是还有另一种优雅的方法吗?
示例目标,目标是获取节点和链接:
param1 | param2 | param3 |
a | b | d |
w | c | d |
a | b | d |
z | c | e |
#nodes:
nodes = data.frame("name" =
c(
a, #node 0
w, #node 1
z, #node 2
b, #node 3
c, #node 4
d, #node 5
e #node 6
))
#links
links = as.data.frame(matrix(c(
0, 3, 2, # from node 0, to node 3, freq
1, 4, 1,
2, 4, 1,
3, 5, 2,
4, 5, 1,
4, 6, 1,
),
byrow = TRUE, ncol = 3))
解决方案
使用igraph包:
library(dplyr)
library(igraph)
# example data
df1 <- read.table(text="
param1 param2 param3
a b d
w c d
a b d
z c e", header = TRUE, stringsAsFactors = FALSE)
# make graph
g <- graph_from_data_frame(
rbind(
setNames(df1[, 1:2], c("from", "to")),
setNames(df1[, 2:3], c("from", "to"))))
nodes <- data.frame(id = as.numeric(V(g)),
name = V(g)$name)
nodes
# id name
# 1 1 a
# 2 2 w
# 3 3 z
# 4 4 b
# 5 5 c
# 6 6 d
# 7 7 e
links <- as.data.frame(get.edges(g, E(g))) %>%
group_by(V1, V2) %>%
summarise(freq = n()) %>%
data.frame()
links
# V1 V2 freq
# 1 1 4 2
# 2 2 5 1
# 3 3 5 1
# 4 4 6 2
# 5 5 6 1
# 6 5 7 1
推荐阅读
- php - Yum php 7.2 安装依赖错误(Centos 6)
- angular - 可观察的最佳实践
- python - 替换字符串中的多个值 - Python
- python - 如何在 Keras 中将自动编码器模型拆分为编码器和解码器?
- python - Python:我不能调用 jupyter notebook
- javascript - 返回不带引号的数组
- c - 在 linux 内核 2.6.26 中,我发现“#define atomic_read(v) ((v)->counter + 0)”,为什么是“+0”?
- c++ - WSAIoctl 函数控制 UDP 套接字的数据包发送速度
- java - 有没有办法将文件加载到java中的多个类而不必每次都调用它们?
- java - 如何将轴时间从“HH:mm:ss.000Z”转换为“HH:mm:ss”格式