Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

R: How to find max length sequence between two values in a vector?

Tags:

r

Let's say I want to find the longest length of consecutive numbers (excluding 0) in a sequence in R.

Example: (0,2,3,0,5) in this case it should return 2 .

The solution I came up with is as follows:

A1 <- c(1, 1, 0,1,1,1)  
length =NULL  
B<-rle(A1==0)  
C<-B$lengths  
D<-B$values  
for(i in 1:length(C)){  
if(D[i]==FALSE){length[i]=C[i]}
}

length <- length [!is.na(length )]  
max(length)  
[1] 3

How can I find the longest sequence of non-zero numbers in a vector in R?

like image 583
user2941942 Avatar asked Oct 27 '25 10:10

user2941942


1 Answers

We could use rle. A==0 output a logical index vector, rle computes the lengths and runs of values of adjacent elements that are the same for logical vector. Extract the lengths of values that are not '0' and get the max after removing the first and last elements to account for the maximum lengths of non-zero elements at the start or end of vector.

 max(with(rle(A==0), lengths[-c(1, length(lengths))][
                     !values[-c(1, length(values))]]))
 #[1] 2

Another example

   A1 <- c(1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0,0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1)
  max(with(rle(A1==0), lengths[-c(1, length(lengths))][
                      !values[-c(1, length(values))]]))
  #[1] 4

Or

 indx <- A1==0
 max(with(rle(A1[which(indx)[1L] : tail(which(indx),1)]==0), 
                   lengths[!values]))
#[1] 4

Update

Based on the new info, may be you can try,

 A1 <- c(1, 1, 0,1,1,1)  
 max(with(rle(A1==0), lengths[!values]))
 #[1] 3
like image 196
akrun Avatar answered Oct 29 '25 01:10

akrun



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!