2015-03-14 18 views
8

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?

risposta

8

è possibile utilizzare la funzione di shift da v1.9.6 data.table +

Definire la funzione

myFunc <- function(x) x/shift(x) 

Selezionare le colonne che si desidera calcolare la percentuale per

cols <- c("alpha", "beta") 

O se vuoi eseguire questo su tutte le le colune eccetto i primi due

cols <- names(dt)[-(1:2)] 

eseguire la funzione sulle colonne

dt[, paste0("change", cols) := lapply(.SD, myFunc), by = type, .SDcols = cols][] 
# type Year  alpha  beta changealpha changebeta 
# 1: A 2000 0.03643256 0.03643256   NA   NA 
# 2: A 2005 0.04019682 0.04019682 1.1033213 1.1033213 
# 3: A 2010 0.03573956 0.03573956 0.8891142 0.8891142 
# 4: B 2000 0.03172361 0.03172361   NA   NA 
# 5: B 2005 0.03282137 0.03282137 1.0346042 1.0346042 
# 6: B 2010 0.02946944 0.02946944 0.8978735 0.8978735 
+0

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

+1

Chiude * tutte * le sessioni R e ne apre solo una e reinstalla di nuovo. –

+1

Chiudere e reinstallare ha funzionato. grazie – DJJ

Problemi correlati