2017-05-05 5 views
4

私はデータテーブルをアルファベット順に注文したいのですが、私はデンマーク出身ですので、Æ、ØおよびÅも注文したいと思います。図書館でsetorderデンマーク語の文字またはデータテーブルの文字のカスタム注文

dk <- c(LETTERS, "Æ", "Ø", "Å") 
dk 
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" 
"S" "T" "U" "V" "W" "X" "Y" "Z" "Æ" "Ø" "Å" 

setorder(data.table)は、このためにいいだろうが、私はソートする必要のあるデンマークの手紙を持っているデータテーブルを作成する場合は、setorderは間違った順序を設定します:彼らはこのように正しく並べられ:

library(data.table) 
DT <- data.table(v1=c("Brød", "Ål", "Øl", "Snegl", "Æble"), v2=1:5) 
setorder(DT) 

DT 
v1 v2 
1: Brød 1 
2: Snegl 4 
3: Ål 2 
4: Æble 5 
5: Øl 3 

setorderをカスタマイズする方法はありますか?私はthis質問を見ましたが、それはあなたが行の設定量を持っている場合にのみ動作しますか?

それは私のコンピュータの設定に関係しているかどうかを知りませんが、私は、この順序を取得しますベース::並べ替えを使用して、順序が異なる(まだ間違った)であること好奇心です:

sort(DT$v1) 
[1] "Æble" "Ål" "Brød" "Øl" "Snegl" 

他のパッケージからの提案も大歓迎です。

答えて

2

私はこのマッチを利用した解決策を見つけました。これは、このpostからのインスピレーションです。完璧ではないので、まだ別の方法のようになりたいので、注文を自分で定義する必要はありません。 ØlとØlbrbrdの両方が最初に来たらどうなりますか?

DT[order(match(substr(DT$v1, 1,1), dk))] 

     v1 v2 
1: Brød 1 
2: Snegl 4 
3: Æble 5 
4: Øl 3 
5: Ål 2 

EDIT:この方法は若干良いですが、私はちょうどより多くのトラブルにつながるパス上だということを感じて...

DT <- data.table(v1=c("Brød", "Ål", "Øl", "Øllebrød", "Brav", "Brøl", "Snegl", "Æble"), v2=1:8) 

DK <- c(LETTERS, "Æ", "Ø", "Å") 
dk <- c(letters, "æ", "ø", "å") 
Dk <- c("", rbind(DK, dk)) 

nr <- max(nchar(DT$v1)) 
for(i in nr:1){ 
DT <- DT[order(match(substr(DT$v1, i,i), Dk))] 
} 

> DT 
     v1 v2 
1:  Brav 5 
2:  Brød 1 
3:  Brøl 6 
4: Snegl 7 
5:  Æble 8 
6:  Øl 3 
7: Øllebrød 4 
8:  Ål 2 
関連する問題