Extraire chaque nième élément d'un vecteur

126

Je voudrais créer un vecteur dans lequel chaque élément est l' i+6thélément d'un autre vecteur.

Par exemple, dans un vecteur de longueur 120, je veux créer un autre vecteur de longueur 20 dans lequel chaque élément est la valeur i, i+6, i+12, i+18...du vecteur initial, c'est-à-dire que je veux extraire chaque 6ème élément de l'original.

RodgerDodger
la source

Réponses:

160
a <- 1:120
b <- a[seq(1, length(a), 6)]
Nico
la source
9
Il est préférable d'utiliser seq.int (1L, length (a), 6L), au moins pour les vecteurs longs
Wojciech Sobala
1
@WojciechSobala Pourriez-vous commenter pourquoi c'est mieux?
dpel
1
@DavidPell seq.intest plus rapide dans les microbenchmarks, mais je soupçonne que toute augmentation des performances dans un programme réel serait éclipsée par le temps d'exécution des autres parties.
Sean1708
Je déteste comparer Python avec R, mais à quel point PyRon pourrait-il être génial? a = 1:120; b = [::6]. Python ne peut pas faire le premier, R pas le second.
bers
44

Une autre astuce pour obtenir des pièces séquentielles (au-delà de la solution seq déjà mentionnée) consiste à utiliser un vecteur logique court et à utiliser le recyclage vectoriel:

foo[ c( rep(FALSE, 5), TRUE ) ]
Greg Snow
la source
2
Un avantage de cette approche est qu'elle peut être utilisée à titre provisoire; pour pouvoir l'utiliser, seqil faut pouvoir faire appel lengthau vecteur. letters[letters < 'm'][c(TRUE, FALSE, FALSE)]
Matt Chambers le
27

Je pense que vous demandez deux choses qui ne sont pas forcément les mêmes

Je veux extraire tous les 6 éléments de l'original

Vous pouvez le faire en indexant une séquence:

foo <- 1:120
foo[1:20*6]

Je voudrais créer un vecteur dans lequel chaque élément est le i + 6ème élément d'un autre vecteur.

Un moyen simple de le faire est de compléter un facteur logique par des FAUX jusqu'à ce que i+6:

foo <- 1:120
i <- 1
foo[1:(i+6)==(i+6)]
[1]   7  14  21  28  35  42  49  56  63  70  77  84  91  98 105 112 119

i <- 10
foo[1:(i+6)==(i+6)]
[1]  16  32  48  64  80  96 112
Sacha Epskamp
la source
Tellement lisse! Je l'ai utilisé dans l'autre sens également, foo[1:(i+6)!=(i+6)]c'est-à - dire sortie toutes les valeurs sauf la sixième.
Fredrik Erlandsson
1

Pour sélectionner chaque nième élément à partir de n'importe quelle position de départ dans le vecteur

nth_element <- function(vector, starting_position, n) { 
  vector[seq(starting_position, length(vector), n)] 
  }

# E.g.
vec <- 1:12

nth_element(vec, 1, 3)
# [1]  1  4  7 10

nth_element(vec, 2, 3)
# [1]  2  5  8 11
stevec
la source