我有一个名为df1的数据框,如下所示:
我希望对df1的列重新排序,以便它们通过匹配列模式进行分组。这意味着在所有行组中具有全1的任何列都在最左边。然后,对于A行和B行,值为1,但C行值为0的任何列,都应遵循...,依此类推,如下面的df2所示。
如果存在联系(并且我的数据集中有很多联系),那么没关系,只要他们根据其列模式进行分组/集群。例如,在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")
答案 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