在data.table中对行进行sorting
假设我在R
有以下data.table
:
library(data.table) DT = data.table(x=rep(c("b","a","c"),each=3), y=c(1,3,6), v=1:9)
我想要按两列(例如列x
和v
)sorting。 我用这个:
DT[order(x,v)] # sorts first by x then by v (both in ascending order)
但现在,我想按x
(按降序)sorting,并具有以下代码:
DT[order(-x)] #Error in -x : invalid argument to unary operator
因此,我认为这个错误是由于class(DT$x)=character
。 你能给我任何build议,以解决这个问题?
我知道我可以使用DT[order(x,decreasing=TRUE)]
,但是我想知道使用两种方式(一些递减,一些递增)同时排列几个语法的语法。
请注意,如果使用DT[order(-y,v)]
,结果是正确的,但是如果使用DT[order(-x,v)]
,则会出现错误。 所以,我的问题是:如何解决这个错误?
更新
data.table现在支持OP的原始尝试,不再需要下面的答案。
你可以使用DT[order(-rank(x), y)]
。
xyv 1: c 1 7 2: c 3 8 3: c 6 9 4: b 1 1 5: b 3 2 6: b 6 3 7: a 1 4 8: a 3 5 9: a 6 6
您只能使用-
在数字条目,所以你可以使用递减和否定顺序你想要的:
DT[order(x,-v,decreasing=TRUE),] xyv [1,] c 1 7 [2,] c 3 8 [3,] c 6 9 [4,] b 1 1 [5,] b 3 2 [6,] b 6 3 [7,] a 1 4 [8,] a 3 5 [9,] a 6 6
DT[order(-x)]
按预期工作。 我有data.table版本1.9.4。 也许这是在最近的版本中修复的。
另外,我build议setorder(DT, -x)
语法与set *命令保持一致,如setnames
, setkey