2015-05-16 4 views
6

Sto cercando un modo per manipolare più colonne in un data.table in R. Come devo affrontare le colonne dinamicamente e un secondo input, non ero in grado di trova una risposta.Cambiare più colonne in data.table r

L'idea è di indice due o più serie in una certa data dividendo tutti i valori per il valore della data es:

set.seed(132) 
# simulate some data 
dt <- data.table(date = seq(from = as.Date("2000-01-01"), by = "days", length.out = 10), 
       X1 = cumsum(rnorm(10)), 
       X2 = cumsum(rnorm(10))) 

# set a date for the index 
indexDate <- as.Date("2000-01-05") 

# get the column names to be able to select the columns dynamically 
cols <- colnames(dt) 
cols <- cols[substr(cols, 1, 1) == "X"] 

Parte 1: Il data.frame Easy/diffusa approccio

df <- as.data.frame(dt) 
# get the right rownumber for the indexDate 
rownum <- max((1:nrow(df))*(df$date==indexDate)) 

# use apply to iterate over all columns 
df[, cols] <- apply(df[, cols], 
        2, 
        function(x, i){x/x[i]}, i = rownum) 

Part 2: The (veloce) approccio data.table Finora il mio approccio data.table assomiglia a questo:

for(nam in cols) { 
    div <- as.numeric(dt[rownum, nam, with = FALSE]) 
    dt[ , 
    nam := dt[,nam, with = FALSE]/div, 
    with=FALSE] 
} 

in particolare tutti gli with = FALSE non sembrano molto simili a data.table.

Conosci qualche modo più veloce/elegante per eseguire questa operazione?

Qualsiasi idea è molto apprezzata!

risposta

8

Un'opzione potrebbe essere quella di utilizzare set poiché ciò implica più colonne. Il vantaggio dell'utilizzo di set è che eviterà il sovraccarico di [.data.table e lo renderà più veloce.

library(data.table) 
for(j in cols){ 
    set(dt, i=NULL, j=j, value= dt[[j]]/dt[[j]][rownum]) 
} 

O una scelta un po 'più lento sarebbe

dt[, (cols) :=lapply(.SD, function(x) x/x[rownum]), .SDcols=cols]