2010-01-14 25 views
17

Tôi đang chạy một mô phỏng Monte-Carlo và đầu ra ở dạng:Tôi luôn luôn phải sử dụng khung dữ liệu trong ggplot2

> 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 

Các lô tôi muốn tạo ra là:

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

tôi biết làm thế nào để làm lô tương đương sử dụng ggplot2, chuyển sang khung dữ liệu

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

sau đó âm mưu rất dễ dàng. Tuy nhiên số lần lặp lại có thể rất lớn và số lượng k cũng có thể lớn. Điều này có nghĩa là rối tung với một khung dữ liệu rất lớn.

Tôi có thể tránh tạo khung dữ liệu mới này không?

Cảm ơn

Trả lời

13

Câu trả lời ngắn gọn là "không", bạn không thể tránh tạo khung dữ liệu. ggplot yêu cầu dữ liệu nằm trong khung dữ liệu. Nếu bạn sử dụng qplot, bạn có thể cung cấp cho nó vectơ riêng biệt cho x và y, nhưng nội bộ, nó vẫn tạo ra một khung dữ liệu trong các tham số mà bạn truyền vào.

Tôi đồng ý với đề xuất của juba - tìm hiểu cách sử dụng chức năng hoặc tốt hơn là gói reshape với các chức năng melt/cast. Một khi bạn nhận được nhanh chóng với việc đưa dữ liệu của bạn ở định dạng dài, tạo ra đồ thị tuyệt vời ggplot trở thành một bước gần hơn!

4

Bạn có thể sử dụng chức năng reshape để chuyển đổi khung dữ liệu sang định dạng "dài". Có thể nó nhanh hơn một chút so với mã của bạn không?

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 
2

Vì vậy, chỉ để thêm vào các câu trả lời trước đó. Với qplot bạn có thể làm

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

và sau đó từ đó tạo thêm nó, ví dụ: với

p + theme_bw() 

Nhưng tôi đồng ý - nóng chảy/bỏ qua là con đường tiến về phía trước.

Các vấn đề liên quan