Data.table'daki satırları `sıra (-x, v) 'dize anahtarında azalan düzende sırala data.table 1.9.4 veya önceki sürümlerde hata veriyor


125

Diyelim ben şu var ki data.tableiçinde R:

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

İki sütuna göre sıralamak istiyorum (sütunlar xve diyelim v). Bunu kullandım:

 DT[order(x,v)] # sorts first by x then by v (both in ascending order)

Ama şimdi, onu x(azalan sırayla) sıralamak ve aşağıdaki koda sahip olmak istiyorum:

  DT[order(-x)] #Error in -x : invalid argument to unary operator

Bu nedenle, bu hatanın bundan kaynaklandığını düşünüyorum class(DT$x)=character. Bu sorunu çözmek için bana herhangi bir öneri verebilir misiniz?

Kullanabileceğimi biliyorum DT[order(x,decreasing=TRUE)], ancak aynı anda her iki yolu kullanarak (bazıları azalıyor, bazıları artıyor) birkaç sütuna göre sıralamak için sözdizimini bilmek istiyorum.

Sonucu kullanırsanız sorun olmadığını DT[order(-y,v)], ancak kullanırsanız DT[order(-x,v)]bir hata olduğunu unutmayın. Öyleyse sorum şu: bu hatayı nasıl çözebilirim?


6
İlginç bir soru, ancak büyük veri kümeleriyle çalışıyorsanız, muhtemelen veri tablolarınız için anahtarlar ayarlamalısınız. Anahtarlar, verilerinizi sonraki indeksleme, alt küme oluşturma, gruplara göre toplama vb. En üst düzeye çıkaran bir sıraya koyar. Bu , verileri yazdırmak için tercih ettiğiniz format olmayabilir , ancak size kazandıracağı hız için genellikle küçük bir bedeldir. .
Josh O'Brien

Ancak, bana öyle geliyor ki bu DT[order(-x)], eşdeğer bir ifade değil setorder(DT, -x)çünkü setorder()aslında hareket DTederken diğeri davranmıyor. Eşdeğer ifadeler DT <- DT [order (-x)] setorder (DT, -x) olacaktır.
jeromeResearch

@jerome Sen haklısın. Pankil bunların eşdeğer olduğunu söylemedi, bu yüzden sanırım olduğu gibi iyi.
Frank

1
@Smci'ye, burada bir başlık düzenlemesinin mantıklı olduğu konusunda katılıyorum, ancak bu sorunun artık alakalı olmadığını belirtmek için değiştirirdim, örneğin, başlığa "data.table 1.9.4 veya daha önce" ekleyerek insanların yapmaması için Google'dan buraya inişe başka bir şey bekleyerek devam edin. Bunu sorularımdan biriyle yaptım stackoverflow.com/questions/30035939/…
Frank

1
Nestorggh, iyileştiremedikçe lütfen yeni başlığı geri almayın. "data.table'daki satırları sırala" neredeyse hiçbir şey söylemedi, temel işlevler yonks için oradaydı. Başlık, asıl sorununuzu belirtmelidir (birinin decr düzen olduğu birden çok anahtar). Bunun 1.9.4 ve önceki sürümlerde bilinen bir sorun olması ve artık bir sorun olmaması da önemlidir.
smci

Yanıtlar:


144

Güncelleme

data.table v1.9.6 + artık OP'nin orijinal denemesini desteklemektedir ve aşağıdaki yanıt artık gerekli değildir.


Kullanabilirsiniz 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
Aşağıda @PankilShah tarafından belirtildiği gibi, bu bir süredir düzeltildi ve OP'nin orijinal yaklaşımı artık beklendiği gibi çalışıyor. C düzeyinde sabitlendiği için commit'i bulamadım ve ne arayacağımı bilmiyorum.
MichaelChirico

1
Harika, teşekkürler. Birinin buraya gelmesi pek olası görünmüyor ... ama öte yandan ben kendimi burada belirsiz bir şekilde alakalı bir şeyi Google'da araştırmaktan buldum.
MichaelChirico

@MichaelChirico aslında, bu cevap için düzenli olarak oy alıyorum, bu yüzden bunu belirttiğinize gerçekten sevindim. Ben gerçekten bir data.table kullanıcısı değilim ve gelişimine ayak uyduramıyorum .
Matthew Plourde

Gerçek sürüm numarasını (1.9.6?) Belirtmek çok kullanışlıdır, bu nedenle NEWS.md arşivlerinde aramaya gitmemize gerek kalmaz .
smci

23

Yalnızca -sayısal girişlerde kullanabilirsiniz , böylece artan sırayla istediğinizleri azaltabilir ve olumsuzlayabilirsiniz:

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
İki charactersütununuz yoksa ve birini artan diğeri azalan sıralamak istemediğiniz sürece bu şekilde seviyorum .
Matthew Plourde

1
@mplourde Bulduğunuz problemin üstesinden gelmek için çözümünüzü bununla birleştirebileceğinizi düşünüyorum. Örneğin, şöyle DT[order(x,-rank(w),decreasing=TRUE)]yazabilirsiniz xve wher ikisi de karakter sütunlarıdır. Teşekkür ederim!
nhern121

17

DT[order(-x)]beklendiği gibi çalışıyor. Data.table 1.9.4 sürümüne sahibim. Belki bu son sürümde düzeltilmiştir.
Ayrıca, önermek setorder(DT, -x)doğrultusunda sözdizimi * sette komutları gibi setnames,setkey

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.