2017-03-16 17 views
2

我有一個有序表,類似如下:R按一個遞增,所有其他降(基於列的順序)

df <- read.table(text = 
"A B C Size 
1 0 0 1 
0 1 1 2 
0 0 1 1 
1 1 0 2 
0 1 0 1", 
header = TRUE) 

在現實中會有更多的列,但這是罰款一個辦法。

我要首先由SIZE(升序)由在優先順序彼此柱(降序)排序該表中,然後 - 通過柱即第一,則B,然後C等

的問題是我不會提前知道列名,所以無法命名它們,但實際上需要「除SIZE以外的所有列」。

最終結果應該是:

A B C Size 
1 0 0 1 
0 1 0 1 
0 0 1 1 
1 1 0 2 
0 1 1 2 

我兩列排序看到的例子,但我只是找不到正確的語法通過「所有其他列順序」排序。

非常感謝

+0

所有這些列是數字還是整數? –

回答

3

我們可以使用arrangedplyr

library(dplyr) 
arrange(df, Size, desc(A), desc(B), desc(C)) 

更多的列數,arrange_可用於

cols <- paste0("desc(", names(df)[1:3], ")") 
arrange_(df, .dots = c("Size", cols)) 
2

隨着名稱使用order這樣。沒有包被使用。

o <- with(df, order(Size, -A, -B, -C)) 
df[o, ] 

這給:

A B C Size 
1 1 0 0 1 
5 0 1 0 1 
3 0 0 1 1 
4 1 1 0 2 
2 0 1 1 2 

或沒有名稱只使用列編號:

o <- order(df[[4]], -df[[1]], -df[[2]], -df[[3]]) 

k <- 4 
o <- do.call("order", data.frame(df[[k]], -df[-k])) 

如果Size始終是最後一列使用k <- ncol(df),或者如果它不一定是最後一個,但始終被稱爲大小,則改爲使用k <- match("Size", names(df))

注:雖然在這個問題中所示的示例然後一個不能否定它們,以便不需要如果列不是數字的更一般的解決辦法是,以取代上述的第一行下面的其中xtfrm是一個R函數將對象轉換爲數字,以便按照預期的順序排序結果。

o <- with(df, order(Size, -xtfrm(A), -xtfrm(B), -xtfrm(C))) 
+0

列是數字,但我不想明確命名它們,因爲它們在每次執行時可能會有所不同。 – Jon

+0

在註釋之前的末尾處注意添加。 –