Ho un data.table pieno di alcuni prodotti di consumo. Ho creato qualche distinzione per i prodotti come 'low'
, 'high'
o 'unknown'
qualità. I dati sono serie temporali e sono interessato a livellare la stagionalità dei dati. Se la classificazione grezza di un prodotto (la classificazione sfornata dall'algoritmo che ho usato per determinare la qualità) è la qualità 'low'
nel periodo X, ma la sua classificazione grezza era la qualità 'high'
nel periodo X-1, sto riclassificando quel prodotto come 'high'
qualità per periodo X. Questo processo è fatto all'interno di una sorta di distinzione di gruppo di prodotti.Comportamento ifelse in data.table (R)
Per fare questo, ho qualcosa di simile al seguente:
require(data.table)
# lag takes a column and lags it by one period,
# padding with NA
lag <- function(var) {
lagged <- c(NA,
var[1:(length(var)-1)])
return(lagged)
}
set.seed(120)
foo <- data.table(group = c('A', rep(c('B', 'C', 'D'), 5)),
period = c(1:16),
quality = c('unknown', sample(c('high', 'low', 'unknown'), 15, replace = TRUE)))
foo[, quality_lag := lag(quality), by = group]
foo[, quality_1 := ifelse(quality == 'low' & quality_lag == 'high',
'high',
quality)]
Dando uno sguardo al foo
:
group period quality quality_lag quality_1
1: A 1 unknown NA unknown
2: B 2 low NA NA
3: C 3 high NA high
4: D 4 low NA NA
5: B 5 unknown low unknown
6: C 6 high high high
7: D 7 low low low
8: B 8 unknown unknown unknown
9: C 9 high high high
10: D 10 unknown low unknown
11: B 11 unknown unknown unknown
12: C 12 low high high
13: D 13 unknown unknown unknown
14: B 14 high unknown high
15: C 15 high low high
16: D 16 unknown unknown unknown
Quindi, quality_1
è in gran parte quello che voglio. Se il periodo X è 'low'
e il periodo X-1 è 'high'
, si verifica la riclassificazione a 'high'
e tutto è rimasto per lo più intatto da quality
. Tuttavia, quando quality_lag
è NA, 'low'
viene riclassificato in NA
in quality_1
. Questo non è un problema con 'high'
o 'unknown'
.
Vale a dire, le prime quattro file di foo
dovrebbero simile a questa:
group period quality quality_lag quality_1
1: A 1 unknown NA unknown
2: B 2 low NA low
3: C 3 high NA high
4: D 4 low NA low
Dei pensieri su che cosa sta causando questo?
Per i principianti, non è necessario reinventare la ruota. 'data.table' v> = 1.9.5 ha già la funzione' lag' chiamata 'shift', quindi potresti semplicemente fare' foo [, quality_lag: = shift (quality), by = group] ' –
Secondariamente,' ifelse' è veramente una funzione awefull e cerco sempre di evitarlo. Il mio consiglio sarebbe semplicemente di fare qualcosa come 'foo [, quality_1: = quality] [quality == 'low' e quality_lag == 'high', quality_1: =" high "]' –
@DavidArenburg ha il punto morto. Inoltre, vedi http://stackoverflow.com/q/16275149/1492421 per maggiori informazioni su ifelse –