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
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
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>
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.
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.
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