105 votes

Créer une séquence de valeurs répétées, dans l'ordre?

J'ai besoin d'une séquence de nombres répétés, c'est-à-dire 1 1 ... 1 2 2 ... 2 3 3 ... 3 etc. La façon dont j'ai implémenté cela était :

  nyear <- 20
  names <- c(rep(1,nyear),rep(2,nyear),rep(3,nyear),rep(4,nyear),
             rep(5,nyear),rep(6,nyear),rep(7,nyear),rep(8,nyear))

ce qui fonctionne, mais c'est maladroit, et évidemment ne s'adapte pas bien à l'échelle.

Comment répéter les N entiers M fois chacun en séquence?

  • J'ai essayé de nester seq() et rep() mais cela n'a pas tout à fait fait ce que je voulais.
  • Je peux évidemment écrire une boucle for pour faire cela, mais il devrait y avoir une manière intrinsèque de le faire!

193voto

Dirk Eddelbuettel Points 134700

Vous avez oublié l'argument each= pour rep():

R> n <- 3
R> rep(1:5, each=n)
 [1] 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5
R> 

donc votre exemple peut être fait simplement avec

R> rep(1:8, each=20)

5voto

tmfmnk Points 8978

Une autre option en R de base pourrait être gl():

gl(5, 3)

Où la sortie est un facteur:

 [1] 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5
Levels: 1 2 3 4 5

Si des entiers sont nécessaires, vous pouvez le convertir:

as.numeric(gl(5, 3))

 [1] 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5

2voto

ludvigolsen Points 51

Pour votre exemple, la réponse de Dirk est parfaite. Si vous aviez plutôt un data frame et que vous vouliez ajouter ce type de séquence en tant que colonne, vous pourriez également utiliser group de groupdata2 (disclaimer: mon package) pour diviser de manière vorace les points de données en groupes.

# Attacher groupdata2
library(groupdata2)
# Créer un data frame aléatoire
df <- data.frame("x" = rnorm(27))
# Créer des groupes de 5 membres chacun (sauf le dernier groupe)
group(df, n = 5, method = "greedy")
         x .groups

 1  0.891  1      
 2 -1.13   1      
 3 -0.500  1      
 4 -1.12   1      
 5 -0.0187 1      
 6  0.420  2      
 7 -0.449  2      
 8  0.365  2      
 9  0.526  2      
10  0.466  2      
# … avec 17 rangées supplémentaires

Il existe toute une série de méthodes pour créer ce type de facteur de regroupement. Par exemple, par nombre de groupes, une liste de tailles de groupe, ou en ayant les groupes commencer lorsque la valeur dans une colonne diffère de la valeur dans la rangée précédente (par exemple, si une colonne est c("x","x","y","z","z") le facteur de regroupement serait c(1,1,2,3,3).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X