Sayak
Sayak

Reputation: 193

Remove zeros in the start and end of a vector

I have a vector like this:

x <-  c(0, 0, 0, 0, 4, 5, 0, 0, 3, 2, 7, 0, 0, 0)

I want to keep only the elements from position 5 to 11. I want to delete the zeroes in the start and end. For this vector it is quite easy since it is small.

I have very large data and need something in general for all vectors.

Upvotes: 8

Views: 5354

Answers (4)

Neal Fultz
Neal Fultz

Reputation: 9696

I would probably define two functions, and compose them:

trim_leading <- function(x, value=0) {
  w <- which.max(cummax(x != value))
  x[seq.int(w, length(x))]
}

trim_trailing <- function(x, value=0) {
  w <- which.max(cumsum(x != value))
  x[seq.int(w)]
}

And then pipe your data through:

x %>% trim_leading %>% trim_trailing

Upvotes: 1

moodymudskipper
moodymudskipper

Reputation: 47350

This would also work :

x[cumsum(x) & rev(cumsum(rev(x)))]
# [1] 4 5 0 0 3 2 7

Upvotes: 2

zx8754
zx8754

Reputation: 56249

Try this:

x[ min( which ( x != 0 )) : max( which( x != 0 )) ]

Find index for all values that are not zero, and take the first -min and last - max to subset x.

Upvotes: 15

alko989
alko989

Reputation: 7938

You can try something like:

x=c(0,0,0,0,4,5,0,0,3,2,7,0,0,0)
rl <- rle(x)

if(rl$values[1] == 0)
    x <- tail(x, -rl$lengths[1])
if(tail(rl$values,1) == 0)
    x <- head(x, -tail(rl$lengths,1))

x
## 4 5 0 0 3 2 7

Hope it helps,

alex

Upvotes: 3

Related Questions