Sto provando a calcolare alcune variazioni percentuali in modo conciso usando data.table, ma ho qualche problema a capire interamente come funzionano le operazioni .SD.data.table operazione con .SD: calcolo della variazione percentuale in modo conciso
Diciamo che ho il seguente tabella
dt = structure(list(type = c("A", "A", "A", "B", "B", "B"), Year = c(2000L,
2005L, 2010L, 2000L, 2005L, 2010L), alpha = c(0.0364325563237498,
0.0401968159729988, 0.0357395587861466, 0.0317236054181487, 0.0328213742235379,
0.0294694430578336), beta = c(0.0364325563237498, 0.0401968159729988,
0.0357395587861466, 0.0317236054181487, 0.0328213742235379, 0.0294694430578336
)), .Names = c("type", "Year", "alpha", "beta"), row.names = c(NA,
-6L), class = c("data.table", "data.frame"))
> dt
## type Year alpha beta
## 1: A 2000 0.03643256 0.03643256
## 2: A 2005 0.04019682 0.04019682
## 3: A 2010 0.03573956 0.03573956
## 4: B 2000 0.03172361 0.03172361
## 5: B 2005 0.03282137 0.03282137
## 6: B 2010 0.02946944 0.02946944
Per calcolare la variazione percentuale su alpha, per categoria, mi si avvicinò con il seguente codice:
dt[,change:=list(lapply(3:2,function(x)(.SD[x,alpha]/.SD[
(x-1),alpha]))),by=list(type)][][Year==2000,change:=NA]
Ma qualcosa mi loro potrebbero dice essere un modo più conciso di farlo In particolare, se ci si vuole eseguire la variazione percentuale per entrambe le colonne di seguito non avrebbe funzionato
dt[,c("changeAlpha","changeBeta"):=list(lapply(3:2,
function(x)(.SD[x]/.SD[(x-1)]))),by=list(type)][Year==2000,change:=NA][]
Così ho fatto ricorso a:
dt[,c("changeAlpha","changeBeta"):=list(
lapply(3:2,function(x)(.SD[x,alpha]/.SD[(x-1),alpha])),
lapply(3:2,function(x)(.SD[x,beta]/.SD[(x-1),beta]))),by=list(type)][
Year==2000,c("changeAlpha","changeBeta"):=list(NA,NA)][]
## type Year alpha beta changeAlpha changeBeta
## 1: A 2000 0.03643256 0.03643256 NA NA
## 2: A 2005 0.04019682 0.04019682 1.10332131557826 1.10332131557826
## 3: A 2010 0.03573956 0.03573956 0.889114172877617 0.889114172877617
## 4: B 2000 0.03172361 0.03172361 NA NA
## 5: B 2005 0.03282137 0.03282137 1.03460416276522 1.03460416276522
## 6: B 2010 0.02946944 0.02946944 0.897873527693412 0.897873527693412
Ma le operazioni sembra giusto, ma ha un sacco di avvertimenti che conducimi qui
- Il mio metodo di pensare è completamente sbagliato o è il modo giusto di procedere per questa operazione?
Non ho avuto la versione bordo sanguinamento. Il codice è decisamente più conciso e più facile da leggere. Eppure, dopo aver installato l'ultima versione di data.table e aver eseguito il tuo codice. Ho trovato l'oggetto 'CisOrderedSubset' non trovato. Se avete qualche possibilità in qualche modo? – DJJ
Chiude * tutte * le sessioni R e ne apre solo una e reinstalla di nuovo. –
Chiudere e reinstallare ha funzionato. grazie – DJJ