2013-03-20 4 views
8

mã cũ của tôi trông như thế này:Chuyển đổi đang ggplot2 đơn giản để sử dụng 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 

Bây giờ tôi đã bắt đầu sử dụng thư viện data.table tuyệt vời (thay vì 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 

Tôi không chắc chắn những gì là sai, nhưng có vẻ như mã tôi chạy bên trong J() không được công nhận trong phạm vi bên ngoài.

Làm cách nào để đạt được điều này theo cách thành ngữ dữ liệu?

+2

Tôi không nghĩ rằng nó sẽ hoạt động như thế. Hãy nhớ rằng một data.table ** là ** một data.frame và sử dụng mã cũ của bạn. – Roland

+0

@Roland, có ofcourse tôi vẫn có thể sử dụng mã cũ của tôi. Nhưng nó sẽ đánh bại mục đích sử dụng data.table. Sau đó, tôi muốn khai thác nhóm bằng khả năng datatable (tức là dt [,, by = something]) thay vì sử dụng split() – Kostolma

Trả lời

8

ggplot2 nên được sử dụng với data.tables dạng dài trong cùng một cách như với data.frames dạng dài:

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) 

Đừng ăn dạng data.frames rộng (hoặc data.tables) để ggplot2 .

Vẽ đồ sẽ rất chậm nếu bạn có nhiều nhóm, nhưng do ma thuật bên trong của ggplot2 đó là không có gì data.table thực sự có thể giúp (cho đến khi Hadley thực hiện nó bằng cách nào đó). Bạn có thể thử calulate mật độ bên ngoài ggplot2, nhưng điều đó sẽ chỉ giúp bạn cho đến nay:

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 

Tất nhiên, nếu bạn có nhiều nhóm có thể là bạn làm các loại sai của cốt truyện.