2017-05-05 56 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和Øllebrød,那么哪一个先来呢?

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 

编辑:此方法是稍微好一点,但我觉得我是通向只是比较麻烦的道路上...

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