web-dev-qa-db-fra.com

Comment générer une liste avec une étape d'incrémentation spécifiée?

Comment générer un vecteur avec une étape d'incrémentation spécifiée (par exemple 2)? Par exemple, comment puis-je produire ce qui suit

0  2  4  6  8  10
43
LostLin

Exécuter seq(1, 10, 1) fait ce que 1:10 Est-ce que. Vous pouvez changer le dernier paramètre de seq, c’est-à-dire by, pour qu’il s’agisse du pas de la taille de votre choix.

> #a vector of even numbers
> seq(0, 10, by=2) # Explicitly specifying "by" only to increase readability 
> [1]  0  2  4  6  8 10
75
John

Vous pouvez utiliser la multiplication scalaire pour modifier chaque élément de votre vecteur.

> r <- 0:10 
> r <- r * 2
> r 
 [1]  0  2  4  6  8 10 12 14 16 18 20

ou

> r <- 0:10 * 2 
> r 
 [1]  0  2  4  6  8 10 12 14 16 18 20
7
Travis Nelson

L'exemple suivant montre des points de repère pour quelques alternatives.

library(rbenchmark) # Note spelling: "rbenchmark", not "benchmark"
benchmark(seq(0,1e6,by=2),(0:5e5)*2,seq.int(0L,1e6L,by=2L))
##                     test replications elapsed  relative user.self sys.self
## 2          (0:5e+05) * 2          100   0.587  3.536145     0.344    0.244
## 1     seq(0, 1e6, by = 2)         100   2.760 16.626506     1.832    0.900
## 3 seq.int(0, 1e6, by = 2)         100   0.166  1.000000     0.056    0.096

Dans ce cas, seq.int est la méthode la plus rapide et seq la plus lente. Si l'exécution de cette étape n'est pas si importante (il faut toujours <3 secondes pour générer une séquence de 500 000 valeurs), il est possible que j'utilise quand même seq comme solution la plus lisible.

4
Ben Bolker