remove the last element of a vector
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:7
Solution 1:
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>
Solution 2:
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.
Solution 3:
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.
Solution 4:
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