R按升序排序一列,所有其他列降序(基于列顺序)

Jon*_*Jon 4 sorting r multiple-columns

我有一个有序的表,类似如下:

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)
Run Code Online (Sandbox Code Playgroud)

实际上会有更多的列,但这对于解决方案来说很好.

我希望首先通过SIZE(升序)对该表进行排序,然后按优先级顺序(降序)对每个列进行排序 - 即首先是列A,然后是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
Run Code Online (Sandbox Code Playgroud)

我已经看到了按两列排序的例子,但我找不到正确的语法来按顺序排列'所有其他列'.

非常感谢

G. *_*eck 7

名字order就像这样使用.没有使用包裹.

o <- with(df, order(Size, -A, -B, -C))
df[o, ]
Run Code Online (Sandbox Code Playgroud)

这给出了:

  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
Run Code Online (Sandbox Code Playgroud)

或者没有名称只使用列号:

o <- order(df[[4]], -df[[1]], -df[[2]], -df[[3]])
Run Code Online (Sandbox Code Playgroud)

要么

k <- 4
o <- do.call("order", data.frame(df[[k]], -df[-k]))
Run Code Online (Sandbox Code Playgroud)

如果Size总是最后一列使用,k <- ncol(df)或者它不一定是最后一列但总是称为Size,那么请k <- match("Size", names(df))改用.

注意:虽然问题中显示的示例中不需要列是否为数字,但是人们不能否定它们,因此更通用的解决方案是将上面的第一行替换为以下,其中xtfrmR函数将对象转换为数字这样结果按预期顺序排序.

o <- with(df, order(Size, -xtfrm(A), -xtfrm(B), -xtfrm(C)))
Run Code Online (Sandbox Code Playgroud)


akr*_*run 5

我们可以使用arrangedplyr

library(dplyr)
arrange(df, Size, desc(A), desc(B), desc(C))
Run Code Online (Sandbox Code Playgroud)

对于更多的列数,arrange_可以使用

cols <-  paste0("desc(", names(df)[1:3], ")")
arrange_(df, .dots = c("Size", cols))
Run Code Online (Sandbox Code Playgroud)