2011-08-26 3 views
7

Sto provando a tracciare alcuni gradi che sto prelevando da una fonte esterna. Il formato della data viene in cerca in questo modo:Errore da ggplot2 dati di tracciamento data - valore mancante in cui TRUE/FALSE necessario

2011-08-23T17:07:05 

Così ho analizzarlo con strptime(date, "%FT%X") e ottenere un POSIXlt. Io alla fine con un frame di dati completa che assomiglia a questo:

    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 

con la seguente struttura:

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

Quando provo a tracciare questi dati:

> 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' so cosa sto facendo male qui. Ho ristretto la scelta per la gestione della data in questo modo:

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

... ma come faccio a fare la gestione corretta della data?

risposta

12

Solo momenti di classe POSIXct sono supportati in ggplot2. La classe POSIXct rappresenta il numero (firmato) di secondi dall'inizio del 1970 (nel fuso orario UTC) come vettore numerico. La classe POSIXlt è una lista nominata di vettori che rappresentano nove elementi (sec, min, hour, ecc.).

È possibile utilizzare il seguente:

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

Eh, è pubblicato quasi le stesse cose quasi allo stesso tempo che ho fatto. Ti ringrazio molto per il tuo impegno, però. :) – Dustin

+0

sì, solo 39 secondi :) – rcs

+1

+1 Per spiegare in modo così chiaro. È la prima volta che capisco la differenza. Se solo fosse chiaro nei file di aiuto! (E forse lo è, semplicemente non l'ho ancora trovato.) – Andrie

2

Penso di aver capito questo. La differenza sta nella comprensione di POSIXct rispetto a POSIXlt. POSIXlt è l'ora del calendario in parti. POSIXct è il numero di secondi dall'epoca. strptime restituisce un `POSIXct

Per poter utilizzare questi dati, ho bisogno di convertire i timestamp:

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