處理R中的因素是相當奇特的工作,我必須承認......在對因子水平進行重新排序時,您不會重新排序基礎數值。這裏有一個小演示:
> numbers = 1:4
> letters = factor(letters[1:4])
> dtf <- data.frame(numbers, letters)
> dtf
numbers letters
1 1 a
2 2 b
3 3 c
4 4 d
> sapply(dtf, class)
numbers letters
"integer" "factor"
現在,如果你這個因素轉換爲數字,你會得到:
# return underlying numerical values
1> with(dtf, as.numeric(letters))
[1] 1 2 3 4
# change levels
1> levels(dtf$letters) <- letters[4:1]
1> dtf
numbers letters
1 1 d
2 2 c
3 3 b
4 4 a
# return numerical values once again
1> with(dtf, as.numeric(letters))
[1] 1 2 3 4
正如你可以看到... ...通過改變水平,你只能更改級別(誰會說,呃?),而不是數值!但是,當您使用factor
函數@Jonathan Chang建議時,會發生一些不同的情況:您自己更改數值。
您再次收到錯誤的原因是因爲您做了levels
,然後嘗試使用factor
對其進行驗證。不要這樣做!做不是使用levels
或者你會搞砸(除非你確切知道你在做什麼)。
一個律」建議:避免用相同的名稱爲R的對象命名的對象(df
是F分佈密度函數,letters
給人小寫字母)。在這種特殊情況下,你的代碼不會有問題,但有時可能會......但這會造成混淆,我們不希望這樣做,我們呢?!? =)
相反,使用這樣的事情(我會從再次開始)去:
> dtf <- data.frame(f = 1:4, g = factor(letters[1:4]))
> dtf
f g
1 1 a
2 2 b
3 3 c
4 4 d
> with(dtf, as.numeric(g))
[1] 1 2 3 4
> dtf$g <- factor(dtf$g, levels = letters[4:1])
> dtf
f g
1 1 a
2 2 b
3 3 c
4 4 d
> with(dtf, as.numeric(g))
[1] 4 3 2 1
請注意,您也可以命名你data.frame
與df
和letters
代替g
,和結果將是確定的。實際上,這段代碼與您發佈的代碼完全相同,只是名稱已更改。這部分factor(dtf$letter, levels = letters[4:1])
不會拋出錯誤,但它可能會混淆!
徹底閱讀?factor
說明書! factor(g, levels = letters[4:1])
和factor(g, labels = letters[4:1])
之間有什麼區別?有什麼和levels(g) <- letters[4:1]
和g <- factor(g, labels = letters[4:1])
相似?
你可以把ggplot的語法,所以我們可以幫助你在這一個更多!
乾杯!
編輯:
ggplot2
實際上需要改變這兩個層面和價值觀?嗯......我會把這一個挖出來......
謝謝,這工作。由於一些奇怪的原因,ggplot現在正確地改變了圖例中的順序,但不是在圖中。奇怪的。 – crangos 2010-03-03 23:57:43
ggplot2要求我改變這兩個級別的順序(見上面)以及數據幀值的順序。 df < - df [nrow(df):1,]#reverse – crangos 2010-03-04 00:13:59