2013-03-20 74 views
8

我的舊代碼是這樣的:轉換簡單GGPLOT2代碼使用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 

現在我已經用出色的data.table庫(而不是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 

我不完全確定什麼是錯誤的,但似乎我在J()內運行的代碼在外部範圍內未被識別。

如何以data.table慣用方式實現此目的?

+2

我不認爲它會這樣工作。請記住,data.table **是** data.frame並使用您的舊代碼。 – Roland 2013-03-20 15:39:31

+0

@羅蘭,當然,我仍然可以使用我的舊代碼。但它會挫敗使用data.table的目的。最後,我想利用datatable的能力(即dt [,by = something])而不是使用split() – Kostolma 2013-03-20 16:00:26

回答

8

ggplot2應與長格式data.tables以相同的方式被用作與長格式data.frames:

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) 

不要喂寬幅data.frames(或data.tables)至GGPLOT2 。

繪圖將是如果你有很多團體很慢,但由於ggplot2內部魔那也沒什麼data.table可以真正幫助(直到哈德利莫名其妙地實現它)。您可以嘗試calulate密度外ggplot2,但只能幫你這麼遠:

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 

當然,如果你有很多的組你可能做了錯誤的一種陰謀。

相關問題