2013-03-20 7 views
8

Mein alter Code so aussah verwenden:einfach ggplot2 Code Konvertieren 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 

nun die ausgezeichnete data.table Bibliothek (statt data.frame) Ich habe begonnen:

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 

Ich bin nicht genau sicher, was falsch ist, aber es scheint, dass der Code, den ich innerhalb J() ausführen nicht im äußeren Bereich erkannt wird.

Wie erreiche ich das idiomatisch auf data.table?

+2

Ich glaube nicht, dass es so funktioniert. Denken Sie daran, dass eine data.table ** ein data.frame ist und verwenden Sie Ihren alten Code. – Roland

+0

@Roland, ja natürlich kann ich noch meinen alten Code benutzen. Aber es würde den Zweck der Verwendung von data.table irgendwie besiegen. Schließlich möchte ich die Gruppe durch die Fähigkeit der Datentabelle (d. H. Dt [,, durch = etwas]) ausnutzen, anstatt split() zu verwenden. – Kostolma

Antwort

8

ggplot2 sollte mit langen Format data.tables in der gleichen Weise wie mit langen Format data.frames verwendet werden:

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) 

Sie Wide-Format data.frames nicht füttern (oder data.tables) ggplot2 .

Plotten wird ziemlich langsam sein, wenn Sie viele Gruppen haben, aber aufgrund der internen Magie von ggplot2 das ist nichts data.table kann wirklich helfen (bis Hadley implementiert es irgendwie). Sie können versuchen, die Dichten außerhalb ggplot2, calulate aber das wird Ihnen nur helfen, so weit:

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 

Natürlich, wenn Sie viele Gruppen haben Sie wahrscheinlich die falsche Art von Handlung.

Verwandte Themen