26

我正在运行蒙特卡罗模拟,输出格式如下:

> d = data.frame(iter=seq(1, 2), k1 = c(0.2, 0.6), k2=c(0.3, 0.4))
> d
iter  k1   k2
1     0.2  0.3
2     0.6  0.4

我要生成的图是:

plot(d$iter, d$k1)
plot(density(d$k1))

我知道如何使用 ggplot2 进行等效绘图,转换为数据框

new_d = data.frame(iter=rep(d$iter, 2), 
                   k = c(d$k1, d$k2), 
                   label = rep(c('k1', 'k2'), each=2))

然后绘图很容易。然而,迭代次数可能非常大,并且 k 的数量也可能很大。这意味着要处理一个非常大的数据框。

无论如何我可以避免创建这个新的数据框吗?

谢谢

4

4 回答 4

17

简短的回答是“不”,您无法避免创建数据框。ggplot要求数据在数据框中。如果你使用qplot,你可以给它单独的 x 和 y 向量,但在内部,它仍然在你传入的参数中创建一个数据框。

我同意 juba 的建议——学习使用reshape函数,或者更好的是reshape带有melt/cast函数的包。一旦您快速将数据放入长格式,创建惊人的ggplot图表就更近了一步!

于 2010-01-14T16:02:07.260 回答
9

是的,您可以避免创建数据框:只需为基础层提供一个空参数列表,ggplot(). 这是基于您的代码的完整示例:

图书馆(ggplot2)

d = data.frame(iter=seq(1, 2), k1 = c(0.2, 0.6), k2=c(0.3, 0.4))
# desired plots:
# plot(d$iter, d$k1)
# plot(density(d$k1))

ggplot() + geom_point(aes(x = d$iter, y = d$k1))
# there is not enough data for a good density plot,
# but this is how you would do it:
ggplot() + geom_density(aes(d$k1))

请注意,尽管这允许不创建数据框,但仍可能在内部创建数据框。例如,参见以下摘录?geom_point

所有对象都将被强化以产生一个数据框。

于 2018-03-25T16:00:35.460 回答
4

您可以使用该reshape函数将数据框转换为“长”格式。可能比你的代码快一点?

R> reshape(d, direction="long",varying=list(c("k1","k2")),v.names="k",times=c("k1","k2"))
     iter time   k id
1.k1    1   k1 0.2  1
2.k1    2   k1 0.6  2
1.k2    1   k2 0.3  1
2.k2    2   k2 0.4  2
于 2010-01-14T13:32:51.423 回答
4

所以只是添加到以前的答案。使用 qplot 你可以做到

p <- qplot(y=d$k2, x=d$k1)

然后从那里进一步构建它,例如

p + theme_bw()

但我同意 - 熔化/铸造通常是前进的方向。

于 2010-01-15T12:44:14.013 回答