说我有以下数据框:
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
但是,x1
和x2
实际上已在代码中保存为id <- c("x1", "x2")
向量,我将其用于其他目的。
所以我的问题是我想在我的id
函数中引用x1
而不是x2
和order
,但遗憾的是df[order(df[id], df$let), ]
会导致argument lengths differ
错误。
据我所知(这已在another SO thread处理过),问题在于length(df[id]) == 2
和length(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
对数据框进行排序?
答案 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