Rank/Order/Cluster/Sort 按列模式排列的数据帧

Rank/Order/Cluster/Sort Data Frame by Column Pattern

我有一个名为 df1 的数据框,如下所示:

我希望 re-order df1 的列通过匹配列模式进行分组。这意味着所有行中全为 1 的任何列都分组到最左侧。然后,对于 A 行和 B 行的值为 1,但对于 C 行的值为 0 的任何列都应遵循...等等,就像下面的 df2 中一样。

如果有联系(在我的数据集中有很多),没关系,只要他们 group/cluster 根据他们的列模式。例如,在df2中,如果按顺序切换ex2和ex5列,或者[在下面的评论后编辑]按顺序切换ex3和ex6列,这对我来说也是可以接受的解决方案...

起初我尝试按列总和进行排名,但这显然行不通,因为总和为 2 的关系导致不应相邻的列 "clustering"。例如,我将在 "cluster" 中得到 ex3、ex6、ex3、ex3、ex6,当我希望所有看起来像 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")
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