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

时间:2014-08-13 19:38:37

标签: 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订购{/ p>}

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函数中引用x1而不是x2order ,但遗憾的是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对数据框进行排序?

1 个答案:

答案 0 :(得分:3)

我建议使用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