2011-08-26 7 views
7

Tôi đang cố gắng vẽ một số điểm tôi đang lấy từ nguồn bên ngoài. Định dạng ngày do thỏa thuận tìm kiếm như thế này:Lỗi từ dữ liệu ngày biểu đồ ggplot2 - thiếu giá trị trong đó TRUE/FALSE cần

2011-08-23T17:07:05 

Vì vậy, tôi phân tích nó với strptime(date, "%FT%X") và có được một POSIXlt. Tôi kết thúc với một khung dữ liệu hoàn chỉnh trông như thế này:

    date subject grade 
1 2011-08-23 17:07:05 AP Biology 95.83 
2 2011-08-24 17:07:03 AP Biology 95.83 
3 2011-08-25 17:08:27 AP Biology 95.83 
4 2011-08-17 17:05:54 US History 157.14 
5 2011-08-18 17:05:24 US History 157.14 
6 2011-08-19 17:05:35 US History 157.14 
7 2011-08-22 17:06:25 US History 157.14 
8 2011-08-23 17:07:05 US History 157.14 
9 2011-08-24 17:07:03 US History 157.14 
10 2011-08-25 17:08:27 US History 157.14 
11 2011-08-19 17:05:35 Yearbook 0.00 
12 2011-08-22 17:06:25 Yearbook 0.00 
13 2011-08-23 17:07:05 Yearbook 100.00 
14 2011-08-24 17:07:03 Yearbook 100.00 
15 2011-08-25 17:08:27 Yearbook 100.00 

Với cấu trúc sau:

'data.frame': 15 obs. of 3 variables: 
$ date : POSIXlt, format: "2011-08-23 17:07:05" "2011-08-24 17:07:03" ... 
$ subject: Factor w/ 3 levels "AP Biology","US History",..: 1 1 1 2 2 2 2 ... 
$ grade : num 95.8 95.8 95.8 157.1 157.1 ... 

Khi tôi cố gắng vẽ dữ liệu này:

> ggplot(data=grades, aes(date, grade, factor=subject)) + geom_line() 
Error in if (length(range) == 1 || diff(range) == 0) { : 
    missing value where TRUE/FALSE needed 

I don' Tôi biết tôi đang làm gì sai ở đây. Tôi đã thu hẹp nó xuống ngày xử lý bằng cách thực hiện việc này:

ggplot(data=grades, 
     aes(seq(length(grades[,1])), 
      grade, color=subject)) + geom_line() 

... nhưng làm cách nào để xử lý ngày chính xác?

Trả lời

12

Chỉ lần của lớp POSIXct được hỗ trợ trong ggplot2. Lớp POSIXct đại diện cho số giây (đã ký) kể từ đầu năm 1970 (theo múi giờ UTC) dưới dạng vectơ số. Lớp POSIXlt là danh sách có tên các vectơ đại diện cho chín phần tử (sec, min, hour, v.v ...).

Bạn có thể sử dụng như sau:

grades$date <- as.POSIXct(grades$date) 
+0

Heh, bạn đăng hầu như những thứ cùng một lúc gần như cùng một thời điểm tôi đã làm. Tôi cảm ơn bạn nhiều vì nỗ lực của bạn, mặc dù. :) – Dustin

+0

yep, chỉ 39 giây :) – rcs

+1

+1 Để giải thích điều này một cách rõ ràng. Đây là lần đầu tiên tôi hiểu sự khác biệt. Nếu chỉ có điều này rõ ràng trong các tập tin trợ giúp! (Và có lẽ nó là, tôi chỉ đơn giản là không tìm thấy nó được nêu ra.) – Andrie

2

Tôi nghĩ rằng tôi đã tìm ra điều này. Sự khác biệt là trong sự hiểu biết POSIXct so với POSIXlt. POSIXlt là thời gian theo lịch ở các phần. POSIXct là số giây kể từ thời đại. strptime trả về một 'POSIXct

Để sử dụng dữ liệu này, tôi cần phải chuyển đổi các timestamps:

grades$date <- as.POSIXct(grades$date)