假设我有以下数据框:
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
但是,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
?
最佳答案
我建议使用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/