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.

Respuestas:


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

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

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

¡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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.