Necesito quitar el último número en grupos de vectores, es decir:

v <- 1:3
v1 <- 4:8

debería ser:

v <- 1:2
v1 <- 4:7
InformationsquelleAutor Elizabeth | 2012-08-24

4 Comentarios

  1. 63

    Puede utilizar desplazamientos negativos en head (o tail), por lo que head(x, -1) quita el última elemento:

    R> head( 1:4, -1)
    [1] 1 2 3
    R> 

    Esto también guarda una llamada adicional a la length().

    Edición: Como señaló Jason, este enfoque no es en realidad más rápido. No puede discutir con el empirismo. En mi máquina:

    R> x <- rnorm(1000)
    R> microbenchmark( y <- head(x, -1), y <- x[-length(x)], times=10000)
    Unit: microseconds
                    expr    min      lq median     uq     max
    1   y <- head(x, -1) 29.412 31.0385 31.713 32.578 872.168
    2 y <- x[-length(x)] 14.703 15.1150 15.565 15.955 706.880
    R> 
    • Según la fuente, head llamadas length dos veces, una para la comprobación de errores y de una vez por una llamada a max o min. ¿[ Llamar a un total de tres veces? Por alguna razón, estoy teniendo problemas para encontrar el código que implementa [.
    • +1 Para la edición 🙂 y, lo que es más importante, que me recuerdan que puedo usar head y tail de esta manera.
    • Me encontré con su código en mi máquina y el uso de -length() es de hecho más rápido. Pero si puedo aumentar el tamaño de x a 10000, entonces head es en realidad acerca de 2~3 veces más rápido. Parece que hay cierta dependencia de la longitud del vector, pero no tengo ninguna explicación.
    • por simetría, tail(my_vector,-1) puede ser utilizado para eliminar el primer elemento de
  2. 25

    Uso de la longitud para obtener la longitud del objeto y a quitar la última.

    v[-length(v)]

    Un índice negativo en R extractos todo pero el dado índices.

  3. 8

    Dirk y Iselzer ya han proporcionado las respuestas. Dirk es sin duda el más sencillo, pero en mi sistema, al menos es un poco más lento, probablemente debido a que el vector subconjunto con [ y length comprobación es barato (y de acuerdo a la fuente, head hace uso de length, dos en realidad):

    > x <- rnorm(1000)
    > system.time(replicate(50000, y <- head(x, -1)))
       user  system elapsed 
       3.69    0.56    4.25 
    > system.time(replicate(50000, y <- x[-length(x)]))
       user  system elapsed 
      3.504   0.552   4.058

    Este patrón mantenido por mayor vector de longitudes y más repeticiones. YMMV. La legibilidad de head ciertamente fuera pesos el rendimiento marginal de la mejora de [ en la mayoría de los casos.

    • De acuerdo con él, ahora se añade un punto de referencia ejecutar a mi post también.
    • Sí, aunque la legibilidad es un poco en el ojo del espectador. Siempre me tengo que gastar un extra de unos pocos milisegundos a pensar acerca de lo que head y tail realmente con argumentos negativos … mientras que x[-length(x)], mientras torpe, es idiomático mi R-cerebro empapado.
  4. 3

    Esta es otra opción, que no ha sido sugerido antes. NROW trata de su vector como 1-columna de la matriz.

    v[-max(NROW(v))]#1 2
    v1[-max(NROW(v1))]#4 5 6 7

    Con base en la discusión anterior, esto es (ligeramente) más rápido que todos los otros métodos sugeridos:

    x <- rnorm(1000)
    system.time(replicate(50000, y <- head(x, -1)))
    user  system elapsed 
    3.446   0.292   3.762
    system.time(replicate(50000, y <- x[-length(x)]))
    user  system elapsed 
    2.131   0.326   2.472
    system.time(replicate(50000, y <- x[-max(NROW(x))]))
    user  system elapsed 
    2.076   0.262   2.342
    • Pero, ¿por qué max()?
    • Tienes razón, no es necesario max().

Dejar respuesta

Please enter your comment!
Please enter your name here