2015-10-31 9 views
6

Utilizzo di matplot, Sto tentando di tracciare la 2a, 3a e 4a colonna di airquality data.frame dopo aver diviso queste 3 colonne dal prima colonna di airquality.Errore in ncol (xj): oggetto "xj" non trovato quando si utilizza R matplot()

Comunque sto ricevendo un errore

Error in ncol(xj) : object 'xj' not found 

Perché stiamo ottenendo questo errore? Il seguente codice riprodurrà questo problema.

attach(airquality) 
airquality[2:4] <- apply(airquality[2:4], 2, function(x) x /airquality[1]) 
matplot(x= airquality[,1], y= as.matrix(airquality[-1])) 

risposta

7

Sei riuscito a manipolare i dati in modo interessante. A partire da airquality prima di scherzare con esso. (E per favore non attach() - è inutile e talvolta pericolose/confusa.)

str(airquality) 
'data.frame': 153 obs. of 6 variables: 
$ Ozone : int 41 36 12 18 NA 28 23 19 8 NA ... 
$ Solar.R: int 190 118 149 313 NA NA 299 99 19 194 ... 
$ Wind : num 7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ... 
$ Temp : int 67 72 74 62 56 66 65 59 61 69 ... 
$ Month : int 5 5 5 5 5 5 5 5 5 5 ... 
$ Day : int 1 2 3 4 5 6 7 8 9 10 ... 

Dopo aver fatto

airquality[2:4] <- apply(airquality[2:4], 2, 
          function(x) x /airquality[1]) 

si ottiene

'data.frame': 153 obs. of 6 variables: 
$ Ozone : int 41 36 12 18 NA 28 23 19 8 NA ... 
$ Solar.R:'data.frame': 153 obs. of 1 variable: 
    ..$ Ozone: num 4.63 3.28 12.42 17.39 NA ... 
$ Wind :'data.frame': 153 obs. of 1 variable: 
    ..$ Ozone: num 0.18 0.222 1.05 0.639 NA ... 
$ Temp :'data.frame': 153 obs. of 1 variable: 
    ..$ Ozone: num 1.63 2 6.17 3.44 NA ... 
$ Month : int 5 5 5 5 5 5 5 5 5 5 ... 
$ Day : int 1 2 3 4 5 6 7 8 9 10 ... 

o

sapply(airquality,class) 
##  Ozone  Solar.R   Wind   Temp  Month   Day 
##  "integer" "data.frame" "data.frame" "data.frame" "integer" "integer" 

ovvero you have data frames embedded within your data frame!

rm(airquality) ## clean up 

Ora cambia un carattere e dividere per la colonna airquality[,1] piuttosto che airquality[1] (dividere per un vettore, non un elenco di lunghezza ...)

airquality[,2:4] <- apply(airquality[,2:4], 2, 
         function(x) x/airquality[,1]) 
matplot(x= airquality[,1], y= as.matrix(airquality[,-1])) 

In generale è più sicuro utilizzare l'indicizzazione [, ...] anziché l'indice [] per fare riferimento alle colonne di un frame di dati a meno che tu non sappia davvero cosa stai facendo ...

+0

Bella risposta. Forse dovrebbe essere sottolineato che 'apply' è per gli oggetti' matrix' e 'array'; qui la funzione corretta da usare è 'lapply', poiché' airquality' è un 'data.frame' (e quindi un' elenco'). Oppure si potrebbe costringere a 'matrix' l'oggetto con cui iniziare (qui ha senso, dato che l'obiettivo è chiamare' matplot'). – nicola

Problemi correlati