按字符串键order(-x,v)的降序对data.table中的行进行排序在data.table 1.9.4或更早版本上给出错误


125

比方说,我有以下data.tableR

  library(data.table)
  DT = data.table(x=rep(c("b","a","c"),each=3), y=c(1,3,6), v=1:9)

我想按两列(例如xv)进行排序。我用这个:

 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设置键。键将您的数据按顺序排列,以最大程度地增加后续索引,子集,按组聚合等。这可能不是打印数据的首选格式,但是付出的代价通常是很小的代价。
乔什·奥布莱恩

但是,在我看来,这DT[order(-x)]并不是对等的陈述,setorder(DT, -x)因为setorder()实际上作用于DT另一方却没有。等效语句为DT <-DT [order(-x)] setorder(DT,-x)我对R很陌生,所以如果我记错了,请更正。
jeromeResearch '17

@jerome你是正确的。潘基尔没有说它们是等效的,所以我想一切都很好。
弗兰克

1
我同意@smci的观点,这里的标题编辑是有意义的,尽管我会更改标题以表明该问题不再相关,例如,在标题中添加“ in data.table 1.9.4或更早版本”,这样人们就不会继续从Google登陆这里,期待其他事情。我是通过我的问题之一来做到这一点stackoverflow.com/questions/30035939/…–
Frank

1
Nestorggh,除非可以改进,否则请不要回退新标题。“对data.table中的行进行排序”几乎什么也没说,那是yonks的基本功能。标题需要提及您的实际问题(多个键,其中一个为decr顺序)。同样重要的是,这是1.9.4及更早版本中的已知问题,不再是问题。
smci

Answers:


144

更新资料

data.table v1.9.6 +现在支持OP的原始尝试,不再需要以下答案。


您可以使用DT[order(-rank(x), y)]

   x y v
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

1
正如@PankilShah所指出的那样,此问题已修复了一段时间,OP的原始方法现在可以按预期工作。我找不到提交,因为它是固定在C级别的,而且我也不知道要搜索什么。
MichaelChirico'2

1
太好了,谢谢。似乎没有人会在这里结束...但是,另一方面,我本人却在谷歌上搜索了一些模糊的相关内容。
MichaelChirico

@MichaelChirico实际上,我通常会对此答案进行投票,因此,我很高兴您指出这一点。我不是真正的data.table用户,也没有跟上它的发展。
马修·普卢德

声明实际的发行版号(1.9.6?)非常有用,因此我们不必在NEWS.md的档案文件中查找
smci

23

您只能-在数字条目上使用,因此可以使用递减并以升序取反:

DT[order(x,-v,decreasing=TRUE),]
      x y v
 [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

3
我喜欢这种方式,除非您有两character列,并且要对一个递增的列和另一个递减的列进行排序。
Matthew Plourde 2012年

1
@mplourde我想您可以将您的解决方案与此解决方案结合起来,以解决您提出的问题。举例来说,你可以把:DT[order(x,-rank(w),decreasing=TRUE)]因为xw都是字符列。谢谢!
nhern121

17

DT[order(-x)]如预期般运作。我有data.table版本1.9.4。也许这是在最新版本中修复的。
另外,我建议setorder(DT, -x)语法与保持一套*命令一样setnamessetkey

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.