Ранг / Порядок / Кластер / Сортировать кадр данных по шаблону столбца - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть фрейм данных с именем df1, например:

enter image description here

Я хочу изменить порядок столбцов df1, чтобы они группировались путем сопоставленияшаблон столбца.Это означает, что любой столбец, который имеет все 1 во всех строках группы слева.Затем должен следовать любой столбец, который имеет значение 1 для строки A и строки B, но 0 для строки C, ... и так далее, как в df2 ниже.

enter image description here

Если есть связи (а в моем наборе данных их много), это не имеет значения, если они группируются / группируются в соответствии с ихшаблон столбца.Например, в df2, если столбец ex2 и ex5 переключен по порядку или [править после комментариев ниже] столбец ex3 и ex6 переключен по порядку, это также приемлемое для меня решение ...

Я пыталсяранжирование по сумме столбцов сначала, но это, очевидно, не работает, поскольку связи, где сумма равна 2, приводят к столбцам, которые не должны быть смежными с «кластеризацией».Например, я получу 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")

1 Ответ

0 голосов
/ 02 декабря 2018
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
...