2014-07-14 6 views
5

Sto lavorando con una serie di sequenze VERO e FALSO organizzate per gruppo e che si estendono su un intervallo di tempo (ad esempio giorni). Di seguito, ho avuto il tempo di ricreare un esempio e convertire lo data.frame in un data.table utilizzando il pacchetto data.table.Trova l'ultima riga in una sequenza di valori consecutivi

> dput(df) 
structure(list(day = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 1L, 2L, 3L, 
4L, 5L, 6L, 7L), group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("a", "b"), class = "factor"), 
    condition = structure(c(1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 
    2L, 1L, 1L, 2L, 2L), .Label = c("FALSE", "TRUE"), class = "factor")), .Names = c("day", 
"group", "condition"), row.names = c(NA, -14L), class = "data.frame") 
> library(data.table) 
> df <- as.data.table(df) 
> setkey(df, group) 
> df 
    day group condition 
1: 1  a  FALSE 
2: 2  a  FALSE 
3: 3  a  TRUE 
4: 4  a  TRUE 
5: 5  a  TRUE 
6: 6  a  FALSE 
7: 7  a  FALSE 
8: 1  b  FALSE 
9: 2  b  TRUE 
10: 3  b  TRUE 
11: 4  b  FALSE 
12: 5  b  FALSE 
13: 6  b  TRUE 
14: 7  b  TRUE 

Utilizzando data.table, so come selezionare il primo giorno per ogni gruppo in cui condizione è uguale a "TRUE":

> df[condition == "TRUE", day[1], by = group] 
    group V1 
1:  a 3 
2:  b 2 
> df 
    day group condition 
1: 1  a  FALSE 
2: 2  a  FALSE 
3: 3  a  TRUE  <~~~~~~~~ 
4: 4  a  TRUE 
5: 5  a  TRUE 
6: 6  a  FALSE 
7: 7  a  FALSE 
8: 1  b  FALSE 
9: 2  b  TRUE  <~~~~~~~~ 
10: 3  b  TRUE 
11: 4  b  FALSE 
12: 5  b  FALSE 
13: 6  b  TRUE 
14: 7  b  TRUE 

Quello che vorrei realizzare è un output finale che identifica la ultima riga per la prima sequenza di ciascun gruppo in cui la condizione è uguale a "VERO". Si prega di vedere la mia uscita di seguito:

 group V1 
    1:  a 5 
    2:  b 3 
> df 
    day group condition 
1: 1  a  FALSE 
2: 2  a  FALSE 
3: 3  a  TRUE 
4: 4  a  TRUE 
5: 5  a  TRUE  <~~~~~ 
6: 6  a  FALSE 
7: 7  a  FALSE 
8: 1  b  FALSE 
9: 2  b  TRUE 
10: 3  b  TRUE  <~~~~~ 
11: 4  b  FALSE 
12: 5  b  FALSE 
13: 6  b  TRUE 
14: 7  b  TRUE 

Qualsiasi consigli, suggerimenti, o altro materiale sarebbe molto apprezzato. Grazie per il vostro tempo e sentitevi liberi di fare qualsiasi domanda di chiarimento!

risposta

4

Qui possiamo cercare le modifiche nella condizione, in particolare una transizione da TRUE a FALSE.

a <- df[diff(c(condition,1)) == -1, day[1], by=group] 

# group V1 
# 1:  a 5 
# 2:  b 3 

Pertanto, si assume che la colonna delle condizioni sia un fattore con FALSE come primo livello.

+1

Ho corretto/aggiornato il mio codice per estrarre solo il primo. – MrFlick

+0

lo hai fatto di nuovo! Grazie mille per il tuo tempo. Ho sicuramente bisogno di esplorare più approfonditamente la funzione 'diff'! – ccapizzano