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.