2015-04-16 12 views
6

ho un vettore che assomiglia a questo:sottoinsiemi frame di dati in base alla sequenza vettoriale di almeno 5 valori consecutivi

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 

Ora voglio sottoinsieme A df (con la stessa lunghezza) di questo vettore, ma solo sequenze che hanno un intervallo su un minimo di 5 numeri consecutivi, ad es 0: 4, o 1: 5 (e ovviamente tutto più lungo di questo). Quindi, NA dovrebbe essere FALSE pure.

E.g.

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

Poi il risultato dovrebbe essere

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

risposta

5

F susseguente dà il risultato desiderato

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 

dati

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 Grazie per la modifica. – Khashaa

+0

Viene visualizzato un errore che indica che R non riesce a trovare la funzione rleid? 'Errore in eval (expr, envir, enclos): impossibile trovare la funzione" rleid "' – Pat

+0

@Pat È necessaria la versione di devel di data.table da github. Installalo come 'devtools :: install_github (" Rdatatable/data.table ", build_vignettes = FALSE)' – Khashaa

3

si può provare:

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 

Altro esempio e risultati:

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

Funziona per 'x <- c (NA, 1, 2, 3, 3, 3, 3, 4, NA) '? – Khashaa

+0

'[1] FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE' – Khashaa

+0

Ma non contiene 5 numeri consecutivi. Correggimi se sbaglio – Khashaa