2017-10-10 8 views
0

Je suis en train de préparer une permutation dynamique définie pour un ensemble de données tel qu'il semble cettecombinaison multiple et permutation r

ID  Val Perm 1 Perm 2 Perm3 Perm 4 Perm 5 Perm 6 Perm 7 Perm 8 Perm 9 Perm 10 Perm 11 Perm 12 Perm 13 Perm 14 Perm 15 Perm 16 Perm 17 Perm 18 Perm 19 Perm 20 Perm 21 Perm 22 Perm 23 Perm 24 Perm 25 Perm 26 Perm 27 Perm 28 Perm 29 Perm 30 Perm 31 Perm 32 Perm 33 Perm 34 Perm 35 Perm 36 
12,000  1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 
12,581  2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 
12,857  2 Range 3 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 
13,387  5 Range 3 Range 3 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 3 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 
15,846  2 Range 3 Range 3 Range 3 Range 2 Range 2 Range 2 Range 2 Range 2 Range 3 Range 3 Range 2 Range 2 Range 2 Range 2 Range 2 Range 3 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 
23,387  5 Range 3 Range 3 Range 3 Range 3 Range 2 Range 2 Range 2 Range 2 Range 3 Range 3 Range 3 Range 2 Range 2 Range 2 Range 2 Range 3 Range 3 Range 2 Range 2 Range 2 Range 2 Range 3 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 1 Range 1 Range 1 Range 1 Range 1 Range 1 
25,424  4 Range 3 Range 3 Range 3 Range 3 Range 3 Range 2 Range 2 Range 2 Range 3 Range 3 Range 3 Range 3 Range 2 Range 2 Range 2 Range 3 Range 3 Range 3 Range 2 Range 2 Range 2 Range 3 Range 3 Range 2 Range 2 Range 2 Range 3 Range 2 Range 2 Range 2 Range 2 Range 2 Range 2 Range 1 Range 1 Range 1 
25,424  2 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 2 Range 2 Range 3 Range 3 Range 3 Range 3 Range 3 Range 2 Range 2 Range 3 Range 3 Range 3 Range 3 Range 2 Range 2 Range 3 Range 3 Range 3 Range 2 Range 2 Range 3 Range 3 Range 2 Range 2 Range 3 Range 2 Range 2 Range 2 Range 2 Range 1 
25,932  6 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 2 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 2 Range 3 Range 3 Range 3 Range 3 Range 3 Range 2 Range 3 Range 3 Range 3 Range 3 Range 2 Range 3 Range 3 Range 3 Range 2 Range 3 Range 3 Range 2 Range 3 Range 2 Range 2 
25,932  1 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 Range 3 

de l'ensemble de données

dput(df) 
structure(list(ID = c(12000, 12581, 12857, 13387, 15846, 23387, 
25424, 25424, 25932, 25932), Val = c(1L, 2L, 2L, 5L, 2L, 5L, 
4L, 2L, 6L, 1L)), .Names = c("ID", "Val"), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -10L), spec = structure(list(
    cols = structure(list(ID = structure(list(), class = c("collector_number", 
    "collector")), Val = structure(list(), class = c("collector_integer", 
    "collector"))), .Names = c("ID", "Val")), default = structure(list(), class = c("collector_guess", 
    "collector"))), .Names = c("cols", "default"), class = "col_spec")) 

ici je tente de créer chaque colonne en gardant "Range 1" constant et en incrémentant "Range 2" et en diminuant d'autant "Range 3". Aussi, je l'essaie pour seulement 10 lignes mais à l'avenir le nombre de lignes peut augmenter. Pendant que j'avais essayé avec

apply(combinations(n=3,r=5,v = c("Range 1","Range 2","Range 3"),repeats.allowed = T),2,sort) 

ET

v <- c("Range 1","Range 2","Range 3");expand.grid(rep(list(v), 5)) 

Mais pas le succès cependant. Y a-t-il un autre moyen de le faire? Toutes les idées seraient appreciate.Thanks à l'avance

Domnick

+0

[Comment faire un grand R exemple reproductible?] (Http://stackoverflow.com/questions/5963269) – Sotos

+0

essayé de faire une mise à jour de contrôle dataframe.kindly reproductible – Domnick

+0

Qu'est-ce que 'df $ Val 'représente, et comment cela correspond à des permutations? Quelle est la logique pour générer des colonnes à partir de valeurs? – Gonzo

Répondre

1

Par souci d'explication plus courte et plus universelle (comme vous l'avez mentionné le nombre de lignes peut être râpe que 10) je propose suivant la logique que vous pouvez mettre en œuvre vous-même: Au début, les paramètres initiaux.

n <- 10 
k <- 3 
df <- as.data.frame(lapply(1:n, function(x) x <- k:1)) 

Le code ci-dessous crée toutes les combinaisons uniques de 10 éléments où l'ordre n'a pas d'importance.

all <- as.matrix(expand.grid(df)) 
all_sorted <- t(apply(all, 1, sort)) 
all_sorted_unique <- unique(all_sorted) 

Dans 10-ensemble d'éléments, tous les éléments uniques doivent apparaître

exclude_if_not_all <- 
    which( 
    apply(all_sorted_unique, 1, 
     function(x) length(unique(x))!=3) 
) 

t(all_sorted_unique[-exclude_if_not_all,]) 

Résultat comme prévu.

 [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25] [,26] [,27] [,28] [,29] [,30] [,31] [,32] [,33] [,34] [,35] [,36] 
[1,] 1 1 1 1 1 1 1 1 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 
[2,] 2 2 1 2 1 1 2 1 1  1  2  1  1  1  1  2  1  1  1  1  1  2  1  1  1  1  1  1  2  1  1  1  1  1  1  1 
[3,] 3 2 2 2 2 1 2 2 1  1  2  2  1  1  1  2  2  1  1  1  1  2  2  1  1  1  1  1  2  2  1  1  1  1  1  1 
[4,] 3 3 3 2 2 2 2 2 2  1  2  2  2  1  1  2  2  2  1  1  1  2  2  2  1  1  1  1  2  2  2  1  1  1  1  1 
[5,] 3 3 3 3 3 3 2 2 2  2  2  2  2  2  1  2  2  2  2  1  1  2  2  2  2  1  1  1  2  2  2  2  1  1  1  1 
[6,] 3 3 3 3 3 3 3 3 3  3  2  2  2  2  2  2  2  2  2  2  1  2  2  2  2  2  1  1  2  2  2  2  2  1  1  1 
[7,] 3 3 3 3 3 3 3 3 3  3  3  3  3  3  3  2  2  2  2  2  2  2  2  2  2  2  2  1  2  2  2  2  2  2  1  1 
[8,] 3 3 3 3 3 3 3 3 3  3  3  3  3  3  3  3  3  3  3  3  3  2  2  2  2  2  2  2  2  2  2  2  2  2  2  1 
[9,] 3 3 3 3 3 3 3 3 3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  2  2  2  2  2  2  2  2 
[10,] 3 3 3 3 3 3 3 3 3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3 

Ce que vous devez faire maintenant est de lier uniquement cette matrice à vos données initiales. En fonction

customPermutation <- function(n, k){ 

    df <- as.data.frame(lapply(1:n, function(x) x <- 1:k)) 

    all <- as.matrix(expand.grid(df)) 
    all_sorted <- t(apply(all, 1, sort)) 
    all_sorted_unique <- unique(all_sorted) 

    exclude_if_not_all <- which(apply(all_sorted_unique, 1, function(x) length(unique(x))!=3)) 
    t(all_sorted_unique[-exclude_if_not_all,]) 

} 
+0

cela a fonctionné comme je le voulais. Merci beaucoup. Très apprécié. – Domnick