2012-10-20 62 views
9

我在一個數據框中有一些醫院數據,從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
  • 刪除「不可用」值進行排序

我可能會丟失一些基本的東西了。 HALP!

+2

試試'str(醫院)'?您可能有因素問題。 –

回答

16

在數據框架中,各個組件必須是原子向量。你在你提到的變量中包含數字和字符數據,並且這樣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",我推測通過刪除那些行/元素?,仍然會將剩餘的觀察值留在一個因子中。由於上面提到的原因會在標籤/級別上進行alpha排序,因此無法正常工作。
+0

謝謝您的及時和翔實的迴應! – greenbeansugar