从长数据或单列变量(或其他共享分析)生成节点/边矩阵
Posted
技术标签:
【中文标题】从长数据或单列变量(或其他共享分析)生成节点/边矩阵【英文标题】:Generate a node/edge matrix from long data or single columns of variables (or other shared analyses) 【发布时间】:2022-01-18 10:02:43 【问题描述】:我试图找出几个集群(节点)之间共享和独特特征的数量并将它们可视化。我拥有的数据分为两列。我想我需要把它变成目标/源格式,但我无法从这个当前格式中弄清楚。
以下是一些示例数据:
df <- data.frame(cluster = c(rep(1, 5), rep(2, 5), rep(3, 5)),
feature = c(letters[1:3], letters[7:8], letters[1:3], letters[9:10], letters[2:3], letters[9:11]))
> df
cluster feature
1 1 a
2 1 b
3 1 c
4 1 g
5 1 h
6 2 a
7 2 b
8 2 c
9 2 i
10 2 j
11 3 b
12 3 c
13 3 i
14 3 j
15 3 k
我想显示集群1
与其他1 个集群共享a
,集群1
与其他2 个集群共享b
,集群2
与集群i
共享3
等。
我尝试了很多 tidyr、plyr、dplyr 代码的组合,但我无法弄清楚。例如,这个基本代码给了我集群之间共享伙伴的数量,但不知道它与哪个伙伴共享。
df2 <- df %>%
group_by(feature) %>%
mutate(n_gene = n())
> df2
# A tibble: 15 × 3
# Groups: feature [8]
cluster feature n_gene
<dbl> <chr> <int>
1 1 a 2
2 1 b 3
3 1 c 3
4 1 g 1
5 1 h 1
6 2 a 2
7 2 b 3
8 2 c 3
9 2 i 2
10 2 j 2
11 3 b 3
12 3 c 3
13 3 i 2
14 3 j 2
15 3 k 1
我的目标是拥有一个类似下面的网络(感谢 DiVenn)或另一个类似的可视化,我可以在其中显示每个集群对之间共享特征的数量。
谢谢。
红点代表集群节点之间的独特和共享特征:
【问题讨论】:
【参考方案1】:您的数据与您正在使用的软件包不兼容,这就是您收到错误的原因。
为了可视化网络,您需要一个带有节点的矩阵。像这样的:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 0 0 0 1 1 1 1 0 1 0
[2,] 0 0 1 1 1 1 0 0 0 0
[3,] 0 1 0 0 1 0 1 0 1 0
[4,] 1 1 0 0 0 1 0 0 0 1
[5,] 1 1 1 0 0 1 0 0 0 0
[6,] 1 1 0 1 1 0 1 0 1 0
[7,] 1 0 1 0 0 1 0 0 0 1
[8,] 0 0 0 0 0 0 0 0 0 0
[9,] 1 0 1 0 0 1 0 0 0 1
[10,] 0 0 0 1 0 0 1 0 1 0
1代表有边,0代表没有边。
使用ggnet2
包,您可以可视化这种网络。代码如下所示:
net = rgraph(10, mode = "graph", tprob = 0.5)
net = network(net, directed = FALSE)
# vertex names
network.vertex.names(net) = letters[1:10]
ggnet2(net)
图表如下所示:
我也尝试使用iagraph
绘制您的图表。它的作用是在集群和错误的功能之间创建一个节点,但我仍会将其包括在内以向您展示哪里出了问题。
library(igraph)
df.g <- graph.data.frame(d = df, directed = TRUE)
df.g
plot(df.g, vertex.label = V(df.g)$name)
看起来像这样:
【讨论】:
【参考方案2】:也许是这样的?
df %>%
graph_from_data_frame() %>%
set_vertex_attr(
name = "color",
value = c("green", "red")[1 + (names(V(.)) %in% df$feature)]
) %>%
plot()
【讨论】:
以上是关于从长数据或单列变量(或其他共享分析)生成节点/边矩阵的主要内容,如果未能解决你的问题,请参考以下文章