remove the last element of a vector

后端 未结 4 596
猫巷女王i
猫巷女王i 2020-12-14 14:29

I need to remove the last number in a groups of vectors, i.e.:

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

should become:

v <- 1:2
v1 <-         


        
相关标签:
4条回答
  • 2020-12-14 14:47

    You can use negative offsets in head (or tail), so head(x, -1) removes the last element:

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

    This also saves an additional call to length().

    Edit: As pointed out by Jason, this approach is actually not faster. Can't argue with empirics. On my machine:

    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> 
    
    0 讨论(0)
  • 2020-12-14 14:51

    Use length to get the length of the object and - to remove the last one.

    v[-length(v)]
    

    A negative index in R extracts everything but the given indices.

    0 讨论(0)
  • 2020-12-14 14:56

    This is another option, which has not been suggested before. NROW treats your vector as a 1-column matrix.

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

    Based on the discussion above, this is (slightly) faster then all the other methods suggested:

    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
    
    0 讨论(0)
  • 2020-12-14 15:00

    Dirk and Iselzer have already provided the answers. Dirk's is certainly the most straightforward, but on my system at least it is marginally slower, probably because vector subsetting with [ and length checking is cheap (and according to the source, head does use length, twice actually):

    > 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
    

    This pattern held up for larger vector lengths and more replications. YMMV. The legibility of head certainly out-weights the marginal performance improvement of [ in most cases.

    0 讨论(0)
提交回复
热议问题