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.