比方说,我有以下data.table
的R
:
library(data.table)
DT = data.table(x=rep(c("b","a","c"),each=3), y=c(1,3,6), v=1:9)
我想按两列(例如x
和v
)进行排序。我用这个:
DT[order(x,v)] # sorts first by x then by v (both in ascending order)
但是现在,我想按x
(降序)对其进行排序,并具有以下代码:
DT[order(-x)] #Error in -x : invalid argument to unary operator
因此,我认为此错误是由于事实class(DT$x)=character
。为了解决这个问题,您能给我什么建议吗?
我知道我可以使用DT[order(x,decreasing=TRUE)]
,但是我想知道语法同时使用两种方式(有些减少,有些增加)按几列排序。
请注意,如果使用DT[order(-y,v)]
结果还可以,但是如果使用DT[order(-x,v)]
,则会出现错误。所以,我的问题是:如何解决这个错误?
6
有趣的问题,但是如果使用大型数据集,则可能应该为data.tables设置键。键将您的数据按顺序排列,以最大程度地增加后续索引,子集,按组聚合等。这可能不是打印数据的首选格式,但是付出的代价通常是很小的代价。
—
乔什·奥布莱恩
但是,在我看来,这
—
jeromeResearch '17
DT[order(-x)]
并不是对等的陈述,setorder(DT, -x)
因为setorder()
实际上作用于DT
另一方却没有。等效语句为DT <-DT [order(-x)] setorder(DT,-x)我对R很陌生,所以如果我记错了,请更正。
@jerome你是正确的。潘基尔没有说它们是等效的,所以我想一切都很好。
—
弗兰克
我同意@smci的观点,这里的标题编辑是有意义的,尽管我会更改标题以表明该问题不再相关,例如,在标题中添加“ in data.table 1.9.4或更早版本”,这样人们就不会继续从Google登陆这里,期待其他事情。我是通过我的问题之一来做到这一点stackoverflow.com/questions/30035939/…–
—
Frank
Nestorggh,除非可以改进,否则请不要回退新标题。“对data.table中的行进行排序”几乎什么也没说,那是yonks的基本功能。标题需要提及您的实际问题(多个键,其中一个为decr顺序)。同样重要的是,这是1.9.4及更早版本中的已知问题,不再是问题。
—
smci