Coller deux vecteurs avec des combinaisons d’éléments de tous les vecteurs

J’ai deux vecteurs:

vars <- c("SR", "PL") vis <- c(1,2,3) 

Sur la base de ces vecteurs, j’aimerais créer le vecteur suivant:

 "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3" 

Avec paste j’ai le résultat suivant:

 paste(vars, vis, sep=".") [1] "SR.1" "PL.2" "SR.3" 

Comment puis-je créer le vecteur dont j’ai besoin?

Vous pouvez l’utiliser, mais il peut y avoir une solution plus simple:

 R> apply(expand.grid(vars, vis), 1, paste, collapse=".") [1] "SR.1" "PL.1" "SR.2" "PL.2" "SR.3" "PL.3" 

expand.grid renvoie un data.frame qui, utilisé avec apply , apply le convertit en masortingx . Ceci est tout simplement inutile (et inefficace sur les grandes données). outer donne une masortingx et prend également un argument de fonction. Il sera également très efficace sur les énormes données.

En utilisant outer :

 as.vector(outer(vars, vis, paste, sep=".")) # [1] "SR.1" "PL.1" "SR.2" "PL.2" "SR.3" "PL.3" 

Cette ancienne question a déjà une réponse acceptée. Mais comme il est utilisé comme cible dupe, je pense que cela vaut la peine d’append une solution data.table qui utilise la fonction de jointure croisée CJ() :

 library(data.table) CJ(vars, vis)[, paste(V1, V2, sep =".")] #[1] "PL.1" "PL.2" "PL.3" "SR.1" "SR.2" "SR.3" 

Dans le cas où la commande initiale est importante:

 CJ(vars, vis, sorted = FALSE)[, paste(V1, V2, sep =".")] #[1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3" 

Pour conserver l’ordre des chaînes demandées dans la question, vous pouvez utiliser ces deux modifications des deux méthodes:

Changer l’ordre des vecteurs et combiner dans l’ordre inverse

 apply(expand.grid(vis, vars), 1, function(x) paste(x[2], x[1], sep=".")) [1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3" 

ou transposer la masortingce avant de la convertir en vecteur:

 as.vector(t(outer(vars, vis, paste, sep="."))) [1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3" 

Une autre option utilisant sprintf en combinaison avec expand.grid :

 eg <- expand.grid(vis, vars) sprintf('%s.%s', eg[,2], eg[,1]) 

qui donne:

 [1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3" 

Explication:

  • Avec expand.grid vous créez toutes les combinaisons des deux vecteurs.
  • sprintf colle les deux vecteurs selon le format spécifié ( '%s.%s' ). Chaque partie du format %s est remplacée par les éléments des vecteurs.

Une autre option consiste à utiliser each argument de rep :

 paste(rep(vars, each = length(vis)), vis, sep = ".") 

Je trouve cela plus simple que les solutions basées sur apply ou expand.grid .