Subset data frame based on vector sequence of at least 5 consecutive values

I have a vector that looks like this:

out1[1:200] [1] NA NA NA NA 0 1 2 NA NA NA 1 NA 0 NA 0 1 NA NA 0 NA 0 1 2 2 2 NA 0 1 2 3 4 4 5 6 7 8 9 9 9 9 [41] 10 11 NA 0 0 NA 1 NA 0 1 NA 0 NA 0 1 2 NA 1 NA 0 0 0 1 2 NA NA NA 0 0 NA 0 0 0 1 2 NA 1 2 NA 0 [81] 1 2 3 4 5 6 7 8 NA 0 1 2 3 4 NA 0 1 2 2 3 4 5 NA 0 1 2 3 3 4 5 5 6 7 NA 1 2 NA 1 2 NA [121] 0 1 2 NA 1 2 3 3 3 3 4 NA 0 0 0 1 2 3 4 5 NA NA 0 1 NA NA NA 1 2 2 3 NA 1 2 2 2 NA NA 0 1 [161] NA 1 NA 1 2 NA 0 0 NA NA 0 1 NA NA NA NA 1 2 3 NA NA 1 2 3 4 5 6 NA 1 2 3 4 5 6 6 7 8 NA 0 1 

Now I want to multiply a df (with the same length) by this vector, but only sequences that have a range of at least 5 consecutive numbers, for example. 0: 4, or 1: 5 (and, of course, longer than that). Therefore, NA must also be FALSE .

eg.

 out1: NA NA 0 1 2 2 NA 0 0 1 2 3 3 4 NA 

Then the result should be

 out2: FFFFFFFTTTTTTTF 
+6
source share
2 answers

The following gives the desired result.

 library(data.table) # v >= 1.9.5 (devel version - install from GitHub) data.table(x)[,id:=rleid(!is.na(x)), ][ , aa:=(.N>5) , by = id ][ ,aaa:=4 %in% cumsum(diff(unique(sort(x)))), by = .(id, aa) ]$aaa ## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE ## [15] TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 

<strong> data

 x <- c(NA, NA, NA, NA, NA, 0, 1, 2, NA, 0, 1, 2, 3, 4, 4, 5, NA, 1, 2, 3, 3, 3, 3, 4, NA) 
+5
source

You can try:

 x = c(NA,NA,0,1,2,2,NA,0,0,1,2,3,3,4,NA) with(rle(!is.na(x)), rep(lengths>5, lengths)) & !is.na(x) #[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE 

Other examples and results:

 x = c(NA, NA, 0, 1, 2, 2, NA, 0, 0, 1, 2, 3, 3, 4, NA, NA, NA, NA, NA, NA, NA) #[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE x = c(NA,NA,NA,NA,NA,2,1,NA) #[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
+3
source

Source: https://habr.com/ru/post/985249/


All Articles