r - 使用不同的调用方案按列对数据帧进行排序

标签 r sorting dataframe

假设我有以下数据框:

df <- data.frame(x1 = c(2, 2, 2, 1),
                 x2 = c(3, 3, 2, 1),
                 let = c("B", "A", "A", "A"))
df
  x1 x2 let
1  2  3   B
2  2  3   A
3  2  2   A
4  1  1   A

如果我想订购df通过x1 ,然后x2然后let ,我这样做:

df2 <- df[with(df, order(x1, x2, let)), ]
df2
  x1 x2 let
4  1  1   A
3  2  2   A
2  2  3   A
1  2  3   B

但是,x1x2实际上已保存为 id <- c("x1", "x2")代码前面的向量,我将其用于其他目的。

所以我的问题是我想引用id而不是x1x2 在我的 order 中函数,但不幸的是像 df[order(df[id], df$let), ] 这样的东西将导致 argument lengths differ错误。

据我所知(这已在 another SO thread 中得到解决),问题在于 length(df[id]) == 2length(df$let) == 4 .

我已经能够通过这个解决方法:

df3 <- df[order(df[, id[1]], df[, id[2]], df[, "let"]), ]
df3
  x1 x2 let
4  1  1   A
3  2  2   A
2  2  3   A
1  2  3   B

但它看起来很难看,并且取决于知道 id 的大小.

有没有更优雅的解决方案来按id对我的数据框进行排序然后let

最佳答案

我建议使用do.call(order, ...)并将id和“let”与c()结合起来:

id <- c("x1", "x2")

df[do.call(order, df[c(id, "let")]), ]
#   x1 x2 let
# 4  1  1   A
# 3  2  2   A
# 2  2  3   A
# 1  2  3   B

关于r - 使用不同的调用方案按列对数据帧进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25294713/

相关文章:

r - 在图形上将所有节点连接在一起

r - ggplot2中同一图例中的不同图例键

linq - 除级联时,LINQ Quicksort不稳定

arrays - Swift 二维数组 : Equal rights for rows and columns

java - 按自定义顺序对 Arraylist 进行排序

r - 在 R 中,如何按日期拆分数据框

r - 如何比较不同阶数的因子水平?

r - 更改公式中变量的名称

python - 循环数据帧列表并执行操作

sql - 如何选择每组的第一行?