从长数据或单列变量(或其他共享分析)生成节点/边矩阵

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()

【讨论】:

以上是关于从长数据或单列变量(或其他共享分析)生成节点/边矩阵的主要内容,如果未能解决你的问题,请参考以下文章

athena presto - 从长到宽的多列

CSS盒子模型

单列模式

php怎么生成带冒号的节点和属性的,xml使用SimpleXMLElement类或其他php类

在单列上应用 Pig UDF 并自动生成所有其他列

在其他列中计算具有多个条件的 NaN 单列