2015-10-31 10 views
6

matplotを使用して、airqualityの2番目、3番目、4番目の列をプロットしようとしています。最初の列はairqualityです。 R matplot()を使用しているときにncol(xj)のエラー:オブジェクト 'xj'が見つかりません

は、しかし、私はエラー

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

なぜ我々はこのエラーを取得しているが取得していますか?以下のコードはこの問題を再現します。

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

答えて

7

興味深い方法であなたのデータをマングルすることができました。あなたがそれを混乱させる前にairqualityで始まる。 (そしてないattach()行ってください - それは混乱/不要、時には危険なのです。)

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

あなたは

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

を実行した後、あなたが

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

または

sapply(airquality,class) 
##  Ozone  Solar.R   Wind   Temp  Month   Day 
##  "integer" "data.frame" "data.frame" "data.frame" "integer" "integer" 
を取得します

つまり、今ではより安全だ列airquality[,1]ではなく、airquality[1](ベクターによる除算ではなく、長さ1のリスト...)一般的に

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

によって1文字と除算を変更

rm(airquality) ## clean up 

[, ...]インデックスを使用するのではなく、[]データフレームの列を参照するためにインデックスを作成しています...

+0

素敵な答えです。おそらく、 'apply'は' matrix'オブジェクトと 'array'オブジェクトのためのものであると強調すべきでしょう。ここで 'airquality'は' data.frame'(したがって 'list')なので、正しい関数は' lapply'です。あるいは、最初にオブジェクトを 'matrix'に強制することもできます(ここでは' matplot'を呼び出すことが目的です)。 – nicola

関連する問題