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.

Respostas:


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

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

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.