2016-07-12 2 views
3

У меня есть набор данных, состоящий из дихотомических значений. Это очень большой набор данных, но вот пример:Сортировка столбцов по столбцам, одинаковые столбцы смежные

var1 <- c(1, 0, 1, 1, 0) 
var2 <- c(1, 1, 1, 1, 1) 
var3 <- c(0, 0, 1, 1, 0) 
var4 <- c(0, 0, 1, 1, 0) 
var5 <- c(1, 1, 0, 0, 0) 
dat <- data.frame(var1,var2,var3,var4,var5) 
dat <- as.matrix(dat) 

Я пытаюсь включить две команды в одну. Во-первых, я хочу сгруппировать столбцы, чтобы идентичные столбцы были объединены вместе. Во-вторых, я хочу, чтобы столбцы упорядочивались по суммам столбцов. Я могу сделать то или другое, но не то и другое.

Итак, вывод должен выглядеть следующим образом:

var2 var1 var5 var3 var4 
    1 1 1 0 0 
    1 0 1 0 0 
    1 1 0 1 1 
    1 1 0 1 1 
    1 0 0 0 0 

Наибольшие суммы столбцов не должны быть расположены на левой стороне.

Я попытался с помощью этой команды:

csums <- dat[,order(colSums(dat,na.rm=TRUE))] 

Но столбцы не группироваться по сходству. Возможно, есть способ кластеризации, основанный на сходстве, обусловленном суммой столбцов.

ответ

4

Вот немного странное решение. Во второй раз вы можете заказать свернутое строковое представление столбцов, которое будет служить тай-брейком для наборов колонок, которые равны colSums(). Это гарантирует, что одинаковые столбцы группируются вместе, поскольку они будут лексикографически сортироваться рядом друг с другом.

dat[,order(decreasing=T,colSums(dat,na.rm=T),apply(dat,2L,paste,collapse=''))]; 
##  var2 var1 var5 var3 var4 
## [1,] 1 1 1 0 0 
## [2,] 1 0 1 0 0 
## [3,] 1 1 0 1 1 
## [4,] 1 1 0 1 1 
## [5,] 1 0 0 0 0 
+0

Благодаря очень ! Это сработало отлично. Почему у вас есть «2L», а не только «2» в настройках приложения? Кроме того, какая функция выполняет вставку и сбой? – jj987246

+0

Похоже, что коллапс работает как вторичная процедура сортировки. Что именно означает крах = ''? – jj987246

+0

@ jj987246 Взгляните на документацию ['apply()') (https://stat.ethz.ch/R-manual/R-devel/library/base/html/apply.html). Variadic аргументы '...' передаются в 'FUN()', что в моем решении означает, что аргумент 'collapse = ''' будет передан 'paste()'. Переходя к документации ['paste()') (https://stat.ethz.ch/R-manual/R-devel/library/base/html/paste.html), мы видим, что она требует «свернуть» параметр, который, если указан, используется для сглаживания всех элементов конечного вектора в один элемент с использованием строки 'collapse' в качестве разделителя. – bgoldst

0

Это не кластеризация (обнаружение неконтролируемой структуры) проблема, а просто сортировки проблема с нетривиальной логикой сортировки.

В зависимости от того, что предлагают ваши инструменты, вы можете

  1. рода лексический, то стабильные сортировки по сумме
  2. сортировать по сумме, если разные, вроде лексический, если же суммы