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.

Réponses:


160
a <- 1:120
b <- a[seq(1, length(a), 6)]

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 ) ]

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.