【发布时间】:2019-05-03 20:57:28
【问题描述】:
我有一个名为 df1 的数据框,如下所示:
我希望重新排序 df1 的列,以便它们通过匹配列模式进行分组。这意味着所有行中的所有 1 的任何列都位于最左侧。然后,对于 A 行和 B 行的值为 1,但 C 行的值为 0 的任何列都应遵循...等等,如下面的 df2 所示。
如果有关联(我的数据集中有很多关联),那没关系,只要它们根据其列模式进行分组/聚类即可。比如在df2中,如果ex2&ex5列按顺序切换,或者[在cmets下面编辑]ex3&ex6列按顺序切换,对我来说也是可以接受的方案……
我最初尝试按列总和进行排名,但这显然不起作用,因为总和为 2 的关系会导致列不应该是相邻的“聚类”。例如,当我希望所有看起来像 ex3 的东西和所有看起来像 ex6 的东西放在一起时,我会在一个“集群”中获得 ex3、ex6、ex3、ex3、ex6。应该是 ex3、ex3、ex3、ex6、ex6。
我想遍历每一列,并将模式匹配到我想要的 1 和 0 的模式,但我真的不知道如何对整个列进行模式匹配,而不仅仅是一列中的值。
代码如下:
ex1 <- c(1,0,0)
ex2 <- c(1,1,1)
ex3 <- c(1,0,1)
ex4 <- c(0,1,0)
ex5 <- c(1,1,1)
ex6 <- c(0,1,1)
ex7 <- c(0,0,1)
ex8 <- c(1,1,0)
df1 <- data.frame(ex1,ex2,ex3, ex4, ex5, ex6, ex7, ex8)
rownames(df1) <- c("a", "b", "c")
df2 <- data.frame(ex2, ex5, ex8, ex6, ex3, ex1, ex4, ex7)
rownames(df2) <- c("a", "b", "c")
【问题讨论】:
-
值是否只有 0 和 1?你能解释一下
ex6和ex3背后的逻辑吗?为什么ex6领先于ex3?您想根据列中 1 的数量对它们进行排序吗? -
只是一个非常快速的想法,如何创建一个集群热图对象,例如
h <- heatmap(as.matrix(df1))然后使用行和列顺序创建新的数据框,所以df2 <- df[rev(h$rowInd), rev(h$colInd)]? -
这是真的您的实际问题还是只是一个玩具示例,因为这对解决方案很重要。 3 行的解决方案和您所说的“因素”组合的顺序可能与更通用的不同。
-
值只有 0 或 1 (@Ronak Shah)。 ex6 和 ex3 可以按顺序互换...我不是根据列中 1 的总和对列进行聚类,而是在它们在同一行中具有相同的 1 和 0 模式...我有“交互”数据(关联矩阵?)。 A 1 代表蛋白质 ex7 与细菌“菌株 c”的相互作用。我正在尝试将所有与菌株相互作用相似的交互器聚集在一起,以便我制作的热图(@Joe)更清晰易读。然后我可以看到哪些蛋白质在菌株之间具有相似的相互作用。这是一个玩具示例 (@hrbrmstr)。
-
@Joe 如果我使用热图,它们不会按照我需要的方式聚集。 rev 函数对数据框有什么作用?