2017-05-05 4 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" "Æ" "Ø" "Å" 

라이브러리 (data.table)에서 setorder이에 대한 좋은 것입니다,하지만 난 정렬 할 필요 덴마크어 문자가있는 데이터 테이블을 만들 경우, 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