按列模式排列/排序/排列/排序数据框

时间:2018-12-02 09:21:57

标签: r sorting rank bipartite

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

enter image description here

我希望对df1的列重新排序,以便它们通过匹配列模式进行分组。这意味着在所有行组中具有全1的任何列都在最左边。然后,对于A行和B行,值为1,但C行值为0的任何列,都应遵循...,依此类推,如下面的df2所示。

enter image description here

如果存在联系(并且我的数据集中有很多联系),那么没关系,只要他们根据其列模式进行分组/集群。例如,在df2中,如果按顺序切换了ex2和ex5列,或者按顺序切换了[在下面的评论后编辑]列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")

1 个答案:

答案 0 :(得分: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