2015-04-15 2 views
2

Учитывая вектор, как:Как вычислить перестановки групповых меток с R?

labels <- c(1,2,3,3,3) 

Как получить все возможные группу перемаркировок? Для этого примера:

1,2,3,3,3 
1,3,2,2,2 
2,1,3,3,3 
2,3,1,1,1 
3,1,2,2,2 
3,2,1,1,1 

Я смотрел на permute пакет, но я не вижу, как применить его к этому случаю.

+0

http: // stackoverflow.com/questions/7906332/how-to-calculate-combination-and-permutation-in-r – Khashaa

+0

Вы пробовали 'permn' из' combinat'? –

+0

После комментария @khashaa я просто читал документ combinat. – alberto

ответ

5

Как об этом решении

labels <- c(1,2,3,3,3) 
library(data.table) 
a <- do.call(cbind, combinat::permn(unique(labels))) 
data.table(a)[,lapply(.SD, function(x)x[labels]),] 
# V1 V2 V3 V4 V5 V6 
#1: 1 1 3 3 2 2 
#2: 2 3 1 2 3 1 
#3: 3 2 2 1 1 3 
#4: 3 2 2 1 1 3 
#5: 3 2 2 1 1 3 

Или просто

apply(a, 2, function(x) x[labels]) 
#  [,1] [,2] [,3] [,4] [,5] [,6] 
#[1,] 1 1 3 3 2 2 
#[2,] 2 3 1 2 3 1 
#[3,] 3 2 2 1 1 3 
#[4,] 3 2 2 1 1 3 
#[5,] 3 2 2 1 1 3 
0

я выкладываю здесь свое собственное решение, как это было предложено:

library(combinat) 

labels <- c(1,2,3,3,3) 

group.perms <- permn(unique(labels)) 
for(i in 1:length(group.perms)){ 
    cat(match(labels, group.perms[[i]]), "\n") 
} 

#2 1 3 3 3 
#3 1 2 2 2 
#3 2 1 1 1 
#2 3 1 1 1 
#1 3 2 2 2 
#1 2 3 3 3 

(но мне нравится второе решение, предложенное @ Хашаа лучше)

Смежные вопросы