2015-02-10 46 views
1

我具有由2列,一分一列因子( 「C7」: 「C20」)的數據幀另一個是數字。當我嘗試繪圖數據框,的因素排序按字母順序出現,即在C10 ... C20,C7,C8,C9開始。我試圖按順序獲得順序,即C7 - > C20。plot()| qplot(...,的geom = 「箱線圖」,...)的不希望的因素排序(R 3.1.2)

我試圖訂購與因子功能的因素:

X2 <- factor(X1$column1, levels:c("C7", "C8", "C9", ... , "C20")) 

編輯:{I已經意識到上面的代碼是不正確。詳見下面的評論}。

但是這改變了整個數據幀因子類,和繪圖函數不能識別因素箱圖 - 例如「錯誤:GGPLOT2不知道如何處理類因素的數據」

任何想法?

+0

這是沒有意義的。如果將data.frame的一列轉換爲factor,那麼它不應該影響其餘的列。你確定它不是矩陣嗎?在上面的代碼中,您只需爲變量X2分配一個因子。排序問題還是繪製data.frame?目前還不清楚。也許你需要創建一個可重現的例子,以便向我們展示你所需要的。 – LyzandeR 2015-02-10 12:13:31

+0

我道歉,如果我已經讓你感到困惑。我是R新手。問題在於將data.frame繪製爲boxplot。數字y軸很好。然而,x軸上的因子的排序不符合要求,即C7-C20。相反,x軸從C10 ... C20,C7,C8,C9開始排序。數據的結構使得每個因子大約有100個觀測值。我看到上面的代碼中出錯的地方...... X2只包含因子變量,而不包含數值變量。數據的類是一個data.frame。 – user3740620 2015-02-10 12:54:26

回答

1

我想通了如何改變一個數據幀,已整理我的問題出在類的變量。我需要引用數據幀中的變量來改變它的類:

df$col1 <- factor(df$col1, levels= c("C7", "C8", "C9", "C10", ..., "C20")) 
+0

我用'mixedsort'發佈了一個替代方案,例如,如果您有100個因素,例如在這種情況下,它會花費您很長時間來輸入這些內容。作爲備選 :)。但是這是想法,因此upvote。 – LyzandeR 2015-02-10 14:28:10

+0

感謝LyzandeR。是的,使用所有引號等字符輸入C7 ... C10,令人惱火。 'mixedsort()'函數非常有用。謝謝! – user3740620 2015-02-11 14:35:33

+0

不客氣:)很高興我能幫忙:) – LyzandeR 2015-02-11 14:38:04

0

這裏是一個可能的解決方案:圖表第一無x軸的數據值,然後用正確的標籤

df = data.frame(fact = paste0("C",c(7:20)), num = runif(14)) 
plot(df$num, xaxt="n") 
axis(1, at = 1:length(df$num), labels = df$fact) 

添加它,那麼你可以改變type =plot改變劇情的類型(點,線,步驟等)

+0

謝謝clemlaflemme。問題:如果我用一個獨立的數據框標記軸,R怎麼知道哪個數據觀察屬於哪個組? – user3740620 2015-02-10 13:23:21

+0

確定沒有控制權,我不知道@LyzandeR提出的'mixedsort'。這是一個更好的解決方案 – clemlaflemme 2015-02-10 14:51:23

+0

感謝您的考慮clemmlaflemme。您的代碼將來會很有用。謝謝。 – user3740620 2015-02-11 14:38:33

3

好了,所以你需要用mixedsortgtools包才能完成這項工作:

mixedsort各種字母數字字符串根據到他們的號碼部分,即在這種情況下,它正是你所需要的。

示例數據

x <- factor( rep(c('c1','c2','c10','c11'),each=10)) 
y <- runif(40) 
df <- data.frame(y,x) 

boxplot(y ~ x, data=df) 

如果您繪製這個數據,你會看到我得到了同樣的問題,因爲你:

enter image description here

解決方案

但是,如果你使用對等級進行排序0,則表示問題已解決:

library(gtools) 


df <- data.frame(y,x) 
#essentially this is the only line (below) that makes the difference. It just 
#orders the factor's levels in the way you want 
df$x <- factor(df$x, levels=mixedsort(levels(df$x))) 

boxplot(y ~ x, data=df) 

enter image description here