2015-04-16 49 views
6

mam wektor, który wygląda następująco:Podzbiór ramka danych na podstawie sekwencji wektora minimum 5 kolejnych wartości

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 

teraz chce podzbioru do df (o tej samej długości) w tym wektorze, tylko sekwencje o zakresie powyżej 5 kolejnych liczb, np 0: 4 lub 1: 5 (i oczywiście wszystko dłużej niż to). W związku z tym NA również powinny być FALSE.

E.g.

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

Następnie wynik powinien być

out2: F F F F F F F T T T T T T T F 

Odpowiedz

5

F ollowing daje pożądany efekt

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 

danych

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) 
+1

@DavidArenburg Dzięki za edycję. – Khashaa

+0

Pojawia się błąd informujący, że R nie może znaleźć funkcji rleid? 'Błąd w eval (expr, envir, enclos): nie można znaleźć funkcji" rleid "' – Pat

+0

@Pat Potrzebujesz wersji devel danych z github. Zainstaluj go jako 'devtools :: install_github (" Rdatatable/data.table ", build_vignettes = FALSE)' – Khashaa

3

Można spróbować:

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 

Innym przykładem i wyniki:

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 
+0

To działa na 'x <- C (Na, 1, 2, 3, 3, 3, 3, 4, NA) "? – Khashaa

+0

'[1] FALSE PRAWDA PRAWDA PRAWDA PRAWDA PRAWDA PRAWDA FALSE' – Khashaa

+0

Ale nie zawiera 5 kolejnych liczb. Popraw mnie, jeśli się mylę. – Khashaa