2011-08-26 5 views
7

Próbuję wykreślić niektóre oceny, które wyciągam z zewnętrznego źródła. Format daty przychodzi wygląda tak:Błąd z danych o wykreślaniu danych ggplot2 - brakująca wartość, gdy potrzebne jest PRAWDA/FAŁSZ

2011-08-23T17:07:05 

więc analizować je z strptime(date, "%FT%X") i uzyskać POSIXlt. I skończyć z pełnej ramki danych, które wygląda następująco:

    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 

o następującej strukturze:

'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 ... 

Gdy próbuję się wykreślić te dane:

> 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” wiesz, co robię źle tutaj. Zawęziłem to do obsługi daty, wykonując następujące czynności:

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

... ale jak poprawnie wykonać operację daty?

Odpowiedz

12

tylko czasy klasie POSIXct są obsługiwane w ggplot2. Klasa POSIXct reprezentuje (podpisaną) liczbę sekund od początku 1970 roku (w strefie czasowej UTC) jako wektor numeryczny. Klasa POSIXlt to nazwana lista wektorów reprezentujących dziewięć elementów (sec, min, hour itp.).

można użyć następujących:

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

Heh, to pisał niemal te same rzeczy w prawie w tym samym czasie co ja. Bardzo dziękuję za twój wysiłek. :) – Dustin

+0

Tak, tylko 39 sekund :) – rcs

+1

+1 Za wyjaśnienie tego tak wyraźnie. Po raz pierwszy rozumiem różnicę. Gdyby tylko było to jasne w plikach pomocy! (Być może tak jest, po prostu jeszcze tego nie znalazłem.) – Andrie

2

Myślę, że to wymyśliłem. Różnica polega na zrozumieniu POSIXct w porównaniu do POSIXct. POSIXlt to czas kalendarza w częściach. POSIXct to liczba sekund, które upłynęły od epoki. strptime zwraca `POSIXct

Aby wykorzystać te dane, muszę konwertować timestampów:

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