Extrae cada enésimo elemento de un vector

126

Me gustaría crear un vector en el que cada elemento sea el i+6thelemento de otro vector.

Por ejemplo, en un vector de longitud 120 quiero crear otro vector de longitud 20 en el que cada elemento sea el valor i, i+6, i+12, i+18...del vector inicial, es decir, quiero extraer cada sexto elemento del original.

RodgerDodger
fuente

Respuestas:

160
a <- 1:120
b <- a[seq(1, length(a), 6)]
nico
fuente
9
Es mejor usar seq.int (1L, longitud (a), 6L), al menos para vectores largos
Wojciech Sobala
1
@WojciechSobala ¿Podría comentar por qué es mejor?
Dpel
1
@DavidPell seq.intes más rápido en microbenchmarks, pero sospecho que cualquier aumento en el rendimiento de un programa real se vería reducido por el tiempo de ejecución de otras partes.
Sean1708
Odio comparar Python con R, pero ¿qué tan bueno podría ser PyRon? a = 1:120; b = [::6]. Python no puede hacer lo primero, R no lo segundo.
bers
44

Otro truco para obtener piezas secuenciales (más allá de la solución seq ya mencionada) es usar un vector lógico corto y usar el reciclaje de vectores:

foo[ c( rep(FALSE, 5), TRUE ) ]
Greg Snow
fuente
2
Una ventaja de este enfoque es que puede usarse de forma temporal; para poder usarlo seqdebes poder invocar lengthel vector. letters[letters < 'm'][c(TRUE, FALSE, FALSE)]
Matt Chambers
27

Creo que estás preguntando dos cosas que no son necesariamente lo mismo

Quiero extraer cada sexto elemento del original

Puede hacer esto indexando una secuencia:

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

Me gustaría crear un vector en el que cada elemento sea el elemento i + 6 de otro vector.

Una manera fácil de hacer esto es complementar un factor lógico con FALSE hasta 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
fuente
¡Qué astuto! Lo he usado en la otra dirección también, foo[1:(i+6)!=(i+6)]es decir , muestra todos los valores excepto el sexto.
Fredrik Erlandsson
1

Para seleccionar cada enésimo elemento desde cualquier posición inicial en el vector

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
fuente