2011-03-08 18 views
90

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

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

Respuesta

112
a <- 1:120 
b <- a[seq(1, length(a), 6)] 
+7

es mejor utilizar seq.int (1L, longitud (a), 6 l), al menos para los vectores largos –

+1

@WojciechSobala Podría comentar por qué es mejor? –

+1

@DavidPell 'seq.int' es más rápido en microbenchmarks, pero sospecho que cualquier aumento de rendimiento en un programa real sería empequeñecido por el tiempo de ejecución de otras partes. – Sean1708

21

creo que está pidiendo dos cosas que no son necesariamente los mismos

Quiero extraer todos los elementos 6 de el original

Usted puede hacer esto mediante la indexación de una secuencia:

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

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

Una manera fácil de hacer esto es para complementar un factor lógico con Falses hasta 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 
+0

¡Tan resbaladizo! Lo he usado en la otra dirección también, 'foo [1: (i + 6)! = (I + 6)]' es decir, todos los valores excepto el sexto. –

33

Otro truco para conseguir piezas secuenciales (más allá de la solución SEC ya mencionado) es el uso de un corto lógica vector uso de vectores de reciclaje:

foo[ c(rep(FALSE, 5), TRUE) ] 
+1

Una ventaja de este enfoque es que se puede usar de forma temporal; para usar 'seq' tienes que poder llamar' length' en el vector. 'letras [letras <'m'] [c (VERDADERO, FALSO, FALSO)]' –

Cuestiones relacionadas