11

私の古いコードは次のようになりました:

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.frameの代わりに)優れたdata.tableライブラリの使用を開始しました。

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の慣用的な方法でこれをどのように達成できますか?

4

1 に答える 1

12

ggplot2長い形式のdata.framesと同じように、長い形式のdata.tablesで使用する必要があります。

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にフィードしないでください。

多くのグループがある場合、プロットは非常に遅くなりますが、その内部の魔法のために、実際にはggplot2data.tableも役に立ちません(Hadleyが何らかの方法で実装するまで)。あなたは外の密度を計算することを試みることができます、しかしそれは今の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

もちろん、多くのグループがある場合は、おそらく間違った種類のプロットを実行します。

于 2013-03-20T16:10:37.023 に答える