2013-10-23 11 views
21

Sto provando a creare un set di dati prima di tracciarlo. Ho deciso di usare la funzione di fabbrica gammaplot.ff() e la prima versione del mio codice simile a questo:Evita la conversione da rbind()/cbind() da numerico al fattore

PowerUtility1d <- function(x, delta = 4) { 
    return(((x+1)^(1 - delta))/(1 - delta)) 
} 
PowerUtility1d <- Vectorize(PowerUtility1d, "x") 

# function factory allows multiparametrization of PowerUtility1d() 
gammaplot.ff <- function(type, gamma) { 
    ff <- switch(type, 
       original = function(x) PowerUtility1d(x/10, gamma), 
       pnorm_wrong = function(x) PowerUtility1d(2*pnorm(x)-1, gamma), 
       pnorm_right = function(x) PowerUtility1d(2*pnorm(x/3)-1, gamma) 
      ) 
    ff 
} 

gammaplot.df <- data.frame(type=numeric(), gamma=numeric(), 
          x=numeric(), y=numeric()) 
gammaplot.gamma <- c(1.1, 1.3, 1.5, 2:7) 
gammaplot.pts <- (-1e4:1e4)/1e3 

# building the data set 
for (gm in gammaplot.gamma) { 
    for (tp in c("original", "pnorm_wrong", "pnorm_right")) { 
    fpts <- gammaplot.ff(tp, gm)(gammaplot.pts)  
    dataChunk <- cbind(tp, gm, gammaplot.pts, fpts) 
    colnames(dataChunk) <- names(gammaplot.df) 
    gammaplot.df <- rbind(gammaplot.df, dataChunk) 
    } 
} 

# rbind()/cbind() cast all data to character, but x and y are numeric 
gammaplot.df$x <- as.numeric(as.character(gammaplot.df$x)) 
gammaplot.df$y <- as.numeric(as.character(gammaplot.df$y)) 

Risulta, l'intera struttura di dati contiene i dati di carattere, quindi devo riconvertirlo manualmente (mi ha portato un po 'per scoprire che in primo luogo!). Ricerca SO indicates che ciò accade perché la variabile tipo è carattere. Per evitare questo (! Si può immaginare i problemi di prestazioni sui dati di caratteri, mentre la costruzione del set di dati) ho cambiato il codice un po ':

gammaplot.ff <- function(type, gamma) { 
    ff <- switch(type, 
       function(x) PowerUtility1d(x/10, gamma), 
       function(x) PowerUtility1d(2*pnorm(x)-1, gamma), 
       function(x) PowerUtility1d(2*pnorm(x/3)-1, gamma) 
      ) 
    ff 
} 

for (gm in gammaplot.gamma) { 
    for (tp in 1:3) { 
    fpts <- gammaplot.ff(tp, gm)(gammaplot.pts)  
    dataChunk <- cbind(tp, gm, gammaplot.pts, fpts) 
    colnames(dataChunk) <- names(gammaplot.df) 
    gammaplot.df <- rbind(gammaplot.df, dataChunk) 
    } 
} 

Questo funziona bene per me, ma ho perso un parametro di carattere auto-esplicativo, che è un rovescio della medaglia. C'è un modo per mantenere la prima versione della fabbrica di funzioni senza una conversione implicita di tutti i dati al carattere?

Se c'è un altro modo per ottenere lo stesso risultato, sarei felice di provarlo.

+0

@Thomas, la tua risposta breve è chiaramente sbagliata; vedi risposta accettata Inoltre, affermare che non si dovrebbe fare qualcosa senza un'alternativa non è costruttivo. –

risposta

48

È possibile utilizzare rbind.data.frame e cbind.data.frame anziché rbind e cbind.

+0

È anche abbastanza per usare solo 'cbind.data.frame', poiché' rbind' funziona correttamente (rilevando il frame dei dati come uno dei suoi argomenti). Non avrei mai pensato che sarebbe stato così semplice! – tonytonov

+2

Attenzione: quando usi 'cbind.data.frame()' in combinazione con gli elenchi dei nomi, creerai una matrice n x m, che non hai inteso. Nel caso, questo non è inteso, solo 'unlist()' la lista nominata, prima di usare 'cbind.data.frame()' invece di 'cbind()'. – BurninLeo

+6

'cbind.data.frame (tp, gm, gammaplot.pts, fpts, stringheAsFactors = FALSE)' se non hai stringheAsFactors = F puoi ancora avere fattori. – mtelesha

Problemi correlati