2012-01-30 46 views
1

我在排序stat0列中的後面的數據幀(sds45)時遇到了特殊問題;R多列數據的排序

>sds45 

      icntr  iexpt angle overlap Specified.Shot.Width   V6 mcsp    stat0 
DD.Sigma2  3 1R50_50 45  0     50 rectangular 1.5 3.62075986666667 
DD.Sigma5  6 1R50_35 45  15     50 rectangular 1.5 1.07005992333333 
DD.Sigma8  9 1R50_40 45  10     50 rectangular 1.5  1.36916201 
DD.Sigma11 12 1R50_30 45  20     50 rectangular 1.5 0.951408239333333 
DD.Sigma14 15 1R100_75 45  25     100 rectangular 1.5 11.6972803333333 
DD.Sigma17 18 1R100_80 45  20     100 rectangular 1.5 13.4350596666667 
DD.Sigma20 21 1R100_90 45  10     100 rectangular 1.5   16.654366 
DD.Sigma31 32 1R100_150 45  50     100 rectangular 1.5 2.19166406666667 
DD.Sigma34 35 1R100_160 45  40     100 rectangular 1.5   5.4822418 
DD.Sigma39 40 1C200_25 45  75     100 circular 1.5  0.704197414 
DD.Sigma42 43 1C200_50 45  50     100 circular 1.5 1.03405964333333 
DD.Sigma45 46 1C200_75 45  25     100 circular 1.5 7.03481966666667 
DD.Sigma48 49 1C200_80 45  20     100 circular 1.5 9.19375816666667 

我的第一種方法是這樣的:

test<-sds45[order(sds45$stat0),] 

...這什麼也沒做。

我也試過這樣:

test=orderBy(~stat0, data=sds45) 

我必須有一個基本的概念問題。我希望對此有一點教育。

+0

是stat0列的數字?有趣的事情發生時,你排序字符向量!如果您訂購數字,您首次嘗試使用「訂單」應該很好。 – Justin 2012-01-30 14:58:12

+2

我敢打賭,你的一些列是因素而不是字符/數字。在這種情況下,他們將按照他們的基本代碼進行排序,而不是他們的級別使用'str(sds45)'來檢查。 – 2012-01-30 15:00:59

+0

您的第一種方法適用於我。 'stat0'是數字列嗎? 'str(sds45 $ stat0)'給了你什麼? – 2012-01-30 15:01:56

回答

3

創建數據框時,可能在stat0中有一些非數字字符,因此該列已轉換爲因子。當你對這個因素進行排序時,你會根據底層的代碼進行排序,這些代碼將按照這些值出現的順序排列,因此順序不會改變。

解決方法是將該列轉換爲數字。

您可以轉換系數是數字,如你預期它是使用:

factor_to_numeric <- function(f) 
{ 
    as.numeric(levels(f))[as.integer(f)] 
} 

sds45$stat0 <- factor_to_numeric(sds45$stat0) 

這是也是一個好主意非常重要檢查您的數據集,試圖找到那些非數字字符。如果該列包含髒數據,則數據集的其餘部分可能還需要清理。

+0

謝謝Richie 。我感謝你的有益解釋。 – bob123 2012-01-30 18:44:48

+0

解決方案是解決底層問題,而不是通過強制列是數字來解決問題。 – hadley 2012-02-01 01:14:36

+0

@hadley:同意。我已經修正了語言來澄清這一點。 – 2012-02-01 11:13:49