Extraia cada enésimo elemento de um vetor

126

Eu gostaria de criar um vetor no qual cada elemento é o i+6thelemento de outro vetor.

Por exemplo, em um vetor de comprimento 120, quero criar outro vetor de comprimento 20, no qual cada elemento é o valor i, i+6, i+12, i+18...do vetor inicial, ou seja, quero extrair cada sexto elemento do original.

RodgerDodger
fonte

Respostas:

160
a <- 1:120
b <- a[seq(1, length(a), 6)]
nico
fonte
9
É melhor utilização seq.int (1L, o comprimento (a), 6 L), pelo menos para os vectores longos
Wojciech Sobala
1
@WojciechSobala Você poderia comentar por que é melhor?
Dpel
1
O @DavidPell seq.inté mais rápido nas marcas de microbench , mas suspeito que qualquer aumento de desempenho em um programa real seja diminuído pelo tempo de execução de outras partes.
Jul1 '18
Eu odeio comparar Python com R, mas quão grande poderia ser o PyRon? a = 1:120; b = [::6]. Python não pode fazer o primeiro, R não o último.
bers
44

Outro truque para obter peças seqüenciais (além da solução seq já mencionada) é usar um vetor lógico curto e usar a reciclagem de vetores:

foo[ c( rep(FALSE, 5), TRUE ) ]
Greg Snow
fonte
2
Uma vantagem dessa abordagem é que ela pode ser usada temporariamente; para usar seqvocê tem que poder ligarlength o vetor. letters[letters < 'm'][c(TRUE, FALSE, FALSE)]
Matt Chambers
27

Eu acho que você está perguntando duas coisas que não são necessariamente iguais

Eu quero extrair todo sexto elemento do original

Você pode fazer isso indexando uma sequência:

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

Gostaria de criar um vetor em que cada elemento seja o elemento i + 6º de outro vetor.

Uma maneira fácil de fazer isso é suplementar um fator lógico com FALSEs até 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
fonte
Tão liso! Eu também o usei na outra direção, foo[1:(i+6)!=(i+6)]ou seja , produza todos os valores, exceto o sexto.
Fredrik Erlandsson
1

Para selecionar cada enésimo elemento de qualquer posição inicial no vetor

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
fonte