2017-03-17 88 views
0

我想重新排列基於行名的自定義順序的表中的行,但我的行名稱是字符而不是數字。基於非數字小排序重新排序表

我使用table工具創建了數據表中的R從一個更大的數據幀:

data <- table(allcones$Type, allcones$Location)[,]

這給了我一個表,看起來像這樣:

> Ada Alf Lk Lnd Myv Raud D 3 0 10 0 59 0 H 3777 0 0 0 8 0 L 11 0 34 4 34 5 P 0 0 0 0 187 0 S 585 0 1880 0 460 109 T 100 0 0 0 233 0 U 234 517 401 4057 9 0

行名稱(D,H,L ...)目前按字母順序排列,我認爲這是R中的默認值。但是,它們每個都反映不同的數據類別,所以我想將它們放入一個客戶湯姆的順序。

我嘗試使用 reorder(row.names(data), new.order=c('L', 'D', 'S', 'T', 'H', 'P', 'U'))基於本網站上的其他問題,但這是行不通的。看來row.names(data)reorder函數中不是有效的參數。

我不想創建一個新的列來強制執行訂單,因爲我使用這些數據來製作表格的堆積barplot(使用barplot(data, ...)),我不知道如何擺脫額外的柱。

任何想法?

回答

0

如果您查看幫助文件,reorder用於重新排列因子水平。有點令人困惑的是,使用order(除其他外)來排序data.frames行。

可以使用factor函數以及order來實現您想要的結果。

dfMyOrder <- df[order(factor(row.names(df), levels=c('L', 'D', 'S', 'T', 'H', 'P', 'U'))),] 

返回

dfMyOrder 

    Ada Alf Lk Lnd Myv Raud 
L 11 0 34 4 34 5 
D 3 0 10 0 59 0 
S 585 0 1880 0 460 109 
T 100 0 0 0 233 0 
H 3777 0 0 0 8 0 
P 0 0 0 0 187 0 
U 234 517 401 4057 9 0 

這將爲表工作對象以及data.frames,但作爲@加文 - 辛普森在他的帖子討論,這將是最好進行排序之前計算表格。

+0

注意'data'在OP的例子是類「table」的對象(它實際上是一個包含一些額外內容的矩陣),而不是數據框。 –

+0

@GavinSimpson謝謝。我錯過了。 – lmo

1

這可能不是最佳解決方案,但如果行順序基於列名之一,則可以始終使用dplyr。

例如,如果你想讓他們由「MYV」順序進行排序,你可以使用 -

library('dplyr') 
dataa <- arrange(data, Myv) 
0

的順序從行的名稱確實是字母,它來自於一個事實,即您的變量Type是一個因素(或被強制進入)。在使用table之前,您可以重新排列您的因素水平。

下面是使用warpbreaks數據集附帶有R的例子:

w <- warpbreaks 
table(w$tension, w$wool) 
# The default order here is L, M, H (not alphabetical) 
# A B 
# L 9 9 
# M 9 9 
# H 9 9 
## let's redefine the order: 
w$tension <- factor(w$tension, levels = c("H", "M", "L")) 
table(w$tension, w$wool) 
# A B 
# H 9 9 
# M 9 9 
# L 9 9 
+0

輝煌,謝謝!這工作完美。 –

1

table()方面的枯萎作爲參數傳入的因子水平的排序或脅迫因素的那些參數(在這種情況下將生成級別的默認排序)。

所以,與其

df <- data.frame(f1 = sample(LETTERS[1:5], 1000, replace = TRUE), 
       f2 = sample(letters[23:26], 1000, replace = TRUE)) 
with(df, table(f1, f2)) 

這給

> with(df, table(f1, f2)) 
    f2 
f1 w x y z 
    A 48 41 44 63 
    B 35 50 35 49 
    C 52 79 48 52 
    D 49 51 50 55 
    E 46 45 60 48 

設定的係數參數的levels明確你想要的訂貨。比如我在這裏只是扭轉排序,但你可以明確指定它:

df2 <- transform(df, f1 = factor(f1, levels = LETTERS[5:1]), 
        f2 = factor(f2, levels = letters[26:23])) 
with(df2, table(f1, f2)) 

這給

> with(df2, table(f1, f2)) 
    f2 
f1 z y x w 
    E 48 60 45 46 
    D 55 50 51 49 
    C 52 48 79 52 
    B 49 35 50 35 
    A 63 44 41 48 

在你的具體的例子,我會做

allcones <- transform(allcones, 
         Type = factor(Type, levels = c("L","D","S","T","H","P", "U")) 
with(allcones, table(Type, Location))