【问题标题】:Rank/Order/Cluster/Sort Data Frame by Column PatternRank/Order/Cluster/Sort Data Frame by Column Pattern
【发布时间】: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?你能解释一下ex6ex3背后的逻辑吗?为什么 ex6 领先于 ex3 ?您想根据列中 1 的数量对它们进行排序吗?
  • 只是一个非常快速的想法,如何创建一个集群热图对象,例如h &lt;- heatmap(as.matrix(df1)) 然后使用行和列顺序创建新的数据框,所以df2 &lt;- 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 函数对数据框有什么作用?

标签: r sorting rank bipartite


【解决方案1】:
df1[,order(
  factor(
    apply(df1, 2, function(x) paste0(x, collapse="")), 
    levels = c("111", "110", "011", "101", "100", "010", "001", "000")
  )
)]
##   ex2 ex5 ex8 ex6 ex3 ex1 ex4 ex7
## a   1   1   1   0   1   1   0   0
## b   1   1   1   1   0   0   1   0
## c   1   1   0   1   1   0   0   1

【讨论】:

    猜你喜欢
    • 2012-11-22
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多