2013-03-20 9 views
8

mój stary kod wyglądał tak:Konwersja prosty kod ggplot2 używać 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 

Teraz zaczęła używać doskonałą data.table bibliotekę (zamiast 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 

Nie jestem do końca pewien, co jest nie tak, ale wydaje się, że kod, który wykonuję wewnątrz J(), nie jest rozpoznawany w zewnętrznym zakresie.

Jak mogę to osiągnąć w idiomatyczny sposób data.table?

+2

Nie sądzę, że to będzie działać w ten sposób. Pamiętaj, że data.table ** to ** a data.frame i użyj swojego starego kodu. – Roland

+0

@Roland, yes ofcourse Wciąż mogę używać mojego starego kodu. Ale to w pewien sposób zniszczy cel używania data.table. Poza tym chcę wykorzystać grupę przez zdolność datatable (tj. Dt [,, by = something]) zamiast używania split() – Kostolma

Odpowiedz

8

ggplot2 należy stosować długie data.tables wielkoformatowych w taki sam sposób jak w przypadku długich data.frames format:

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) 

Nie karmić szerokie data.frames Format (lub data.tables) do ggplot2 .

Wykreślanie będzie dość powolne, jeśli masz wiele grup, ale ze względu na wewnętrzną magię ggplot2 to naprawdę nic nie pomoże data.table (dopóki Hadley nie wdroży go w jakiś sposób). Można spróbować calulate gęstości poza ggplot2, ale to będzie tylko pomóc tej pory:

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 

Oczywiście, jeśli masz wiele grup prawdopodobnie zrobić niewłaściwy rodzaj działki.

Powiązane problemy