2013-03-20 13 views
8

mio vecchio codice si presentava così:Conversione semplice codice ggplot2 da usare data.table

library(ggplot2) 
gp<-ggplot(NULL,aes(x=Income)) 
gp<-gp+geom_density(data=dat$Male,color="blue") 
gp<-gp+geom_density(data=dat$Female,color="green") 
gp<-gp+geom_density(data=dat$Alien,color="red") 
plot(gp) #Works 

Ora ho iniziato a utilizzare l'eccellente libreria data.table (invece di data.frame):

library(data.table) 
cols<-c("blue","green","red") 
gp<-ggplot(NULL,aes(x=Income)) 
dat[, list(gp+geom_density(data=.SD, color=cols[.GRP])), by=Gender] 
#I even tried 
dat[, list(gp<-gp+geom_density(data=.SD, color=cols[.GRP])), by=Gender] 
plot(gp) #Error: No layers in plot 

Non sono esattamente sicuro di ciò che è sbagliato, ma sembra che il codice eseguito all'interno di J() non venga riconosciuto nell'ambito esterno.

Come posso raggiungere questo in un modo idiomatico data.table?

+2

Non penso che funzionerà in questo modo. Ricorda che data.table ** è ** un data.frame e usa il tuo vecchio codice. – Roland

+0

@Roland, sì, naturalmente posso ancora usare il mio vecchio codice. Ma sarebbe una sorta di sconfiggere lo scopo di usare data.table. Dopotutto, voglio sfruttare il gruppo per abilità di datatable (cioè dt [,, by = something]) piuttosto che usare split() – Kostolma

risposta

8

ggplot2 deve essere usato con data.tables formato lunghe nello stesso modo come con data.frames formato esteso:

library(data.table) 
set.seed(42) 

dat <- rbind(data.table(gender="male",value=rnorm(1e4)), 
      data.table(gender="female",value=rnorm(1e4,2,1)) 
      ) 

library(ggplot2) 
p1 <- ggplot(dat,aes(x=value,color=gender)) + geom_density() 
print(p1) 

Non alimentare data.frames di grande formato (o data.tables) a ggplot2 .

Il plottaggio sarà piuttosto lento se si dispone di molti gruppi, ma a causa della magia interna dinon c'è niente che lo sia data.table (fino a quando Hadley lo implementa in qualche modo). Si può cercare di Calulate le densità di fuori ggplot2, ma che sarà solo aiutare finora:

set.seed(42) 
dat2 <- data.table(gender=as.factor(1:5000),value=rnorm(1e7)) 
plotdat <- dat2[,list(x_den=density(value)$x,y_den=density(value)$y),by=gender] 
p2 <- ggplot(plotdat,aes(x=x_den,y=y_den,color=gender)) + geom_line() 
print(p2) #this needs some CPU time 

Naturalmente, se si dispone di molti gruppi probabilmente fare il tipo sbagliato di trama.

Problemi correlati