文字列キー「order(-x、v)」でdata.tableの行を降順に並べ替えると、data.table 1.9.4以前でエラーが発生する


125

のは、私は以下の持っていると言う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)

2列(たとえば、列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のキーを設定する必要があります。キーは、後続のインデックス作成、サブセット化、グループごとの集計などを最大化する順序でデータを配置します。これ、データを印刷するのに適した形式でないかもしれませんが、多くの場合、それが得られる速度を犠牲にしても少額です。
Josh O'Brien

ただし、実際には動作しているDT[order(-x)]のに他のユーザーは動作していないsetorder(DT, -x)ため、同等のステートメントではないように見えます。同等のステートメントは次のようになりますDT <-DT [order(-x)] setorder(DT、-x)私はRに非常に新しいので、間違っている場合は修正してください。setorder()DT
jeromeResearch 2017年

@jeromeあなたは正しいです。パンキルはそれらが同等であるとは言わなかったので、私はそれは現状のままで良いと思います。
フランク

1
ここではタイトルの編集が意味があるという@smciに同意しますが、この質問が関連しなくなったことを示すように変更します。何か他のものを期待してグーグルからここに着陸し続けます。私は私の質問の1つでこれを行いました。stackoverflow.com
フランク

1
Nestorggh、改善できる場合を除いて、新しいタイトルをロールバックしないでください。「data.tableで行をソートする」とはほとんど何も言われませんでした。タイトルはあなたの実際の問題を言及する必要があります(1つが降順である複数のキー)。これは1.9.4以前の既知の問題であり、問​​題ではなくなったことも重要です。
smci

回答:


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 2016

1
よろしくお願いします。誰もここに来ることはありそうにないように思われます...しかし、一方で私自身は、漠然と関連している何かをグーグルすることからここに行きました。
MichaelChirico 2016

@MichaelChirico実は、私はいつもこの回答に賛成票を投じているので、あなたがこれを指摘してくれて本当に嬉しいです。私は実際にはdata.tableユーザーではなく、その開発についていません。
Matthew Plourde

実際のリリース番号(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
2つの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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.