10

データフレームにいくつかの病院データがあり、csvから読み込まれます。colユーザー定義の列でデータフレームを並べ替えてから、次のように病院の名前で並べ替えようとしました。

col <- 'Hospital.30.Day.Death..Mortality..Rates.from.Pneumonia'
hospitals.sorted <- hospitals[order(hospitals[,col], hospitals$Hospital.Name),]

しかし、私は何かが欠けていると思います。文字列のようにソートされているcolようです:

> hospitals.sorted
... # so far so good # ...
2749                                                   10.0
2831                                                   10.0
2891                                                   10.0
2837                                                   10.1
2824                                                   10.1
2774                                                   10.1
... # not so good # ...
2856                                                   15.7
2834                                                   15.9
2797                                                   16.0
2835                                                    7.4
2850                                                    7.7
2789                                                    8.1
... # there are some non-numeric values at the very bottom # ...
2806                                                    9.9
2867                                                    9.9
2884                                                    9.9
2808                                          Not Available
2913                                          Not Available
2911                                          Not Available

列が実際に数値であることを確認するだけです。

> sapply(hospitals, mode)
Hospital.30.Day.Death..Mortality..Rates.from.Pneumonia 
"numeric" 
Hospital.Name 
"numeric"

明らかにそうではないのに、なぜHospital.Name数値なのかわかりません。

私が役に立たなかった他のこと:

  • as.numeric(hospitals[,col])内部を使用してorder
  • 並べ替える前に「使用不可」の値を削除する

基本的なものが欠けているかもしれません。やめろ!

4

1 に答える 1

17

データ フレームでは、個々のコンポーネントは原子ベクトルでなければなりません。言及した変数に数値データと文字データの両方を含めているため、Rはそれを文字ベクトルとして読み取ります。ただし、引数のデフォルト設定によりstringsAsFactors、文字ベクトルは因子に変換されます。したがって、数値が数値として格納されているように見えます。ただし、これらは単なるラベルであり、だまされています。

同様に、mode()電話もあなたをだましています。検討

> mode(factor(c(1:10, "a")))
[1] "numeric"

しかし、これは明らかに「数値」データではありません。次に検討する

> mode(factor(letters))
[1] "numeric"

これは、内部的に R の係数が数値変数として格納されているという事実に反しており、それがmode()あなたに伝えていることです。mode()この仕事には不適切なツールです。

変数が数値かどうかをテストするには、is.numeric()代わりに次を使用します。

> is.numeric(factor(c(1:10, "a")))
[1] FALSE
> is.numeric(factor(letters))
[1] FALSE

解決策として。「利用不可」を に設定する必要がありますNA。(または使用したラッパー)呼び出しに追加na.strings = "Not Available"することにより、データを読み込むときにこれを行うことができます。read.table()それは、キャラクター>ファクター変換を整理するのに十分なはずです。

最も重要なヒントはstr()、オブジェクトに適用されたの出力を常に見て、R が希望どおりにデータを読み込んだことを確認することです。したがって、次のことを行う必要があります。

str(hospitals)

Rによる変数の型に注意してください。

あなたが試した他のことについて:

  1. as.numeric(hospitals[,col])因子の各要素のレベル ID を含む数値ベクトルを生成します。因子が特定の順序で並べ替えられる場合、それはレベル表現になります。因子 (ラベル付きバージョン) を数値に変換するには、中間ステップが必要です: as.numeric(as.character(hospitals[, col])). ただし、変数に文字データがあり、R はそれを数値に変換できないため、ここで発生している実際の問題は解決されません。を に変換し"Not Available"ます。NA試してみればうまくいったかもしれませんas.numeric(as.character(hospitals[, col]))
  2. を削除することで"Not Available"、それらの行/要素を削除することで推測しますが、残りの観測値は因子に残ります。ラベル/レベルでアルファソートを行うため、上記の理由により機能しません。
于 2012-10-20T20:43:20.737 に答える