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)
我已经看到了按两列排序的例子,但我找不到正确的语法来按顺序排列'所有其他列'.
非常感谢
名字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)
我们可以使用arrange从dplyr
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)