2011-09-22 4 views
10

R에는 중요한 개체의 목록이 있습니다 (R은 순서를 정의 할 수 있어야한다는 스칼라와 같은 단순한 개체가 아닙니다). 목록을 정렬하고 싶습니다. 대부분의 언어는 프로그래머가 정렬 함수에 전달되는 한 쌍의 목록 요소를 비교하는 함수 또는 유사한 함수를 제공 할 수 있도록합니다. 내 목록을 어떻게 정렬합니까?R에있는 중요하지 않은 요소의 목록 정렬 R

+0

다른 사람들이 당신이 말하는 것에 대한 생각을 갖도록하기 위해 중요하지 않은 요소 목록의 스 니펫을 제공 할 수 있습니까? 여기서 재현 할 수있는 질문을 쓰는 방법에 대한 팁 : http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – Chase

답변

14

이 작업을 간단하게 만들려면 개체가 이름과 값의 두 요소로 구성된 목록이라고 말하면됩니다. 값은 숫자입니다. 그것이 우리가 정렬하고자하는 것입니다. 더 많은 요소가 있고 더 복잡한 것을 처리해야 할 필요가 있다고 생각할 수 있습니다.

sort 도움말 페이지에서 sortxtfrm을 사용합니다. xtfrmx[i] 클래스에 대해 ==> 메서드를 사용한다고 알려줍니다.

먼저 내가 정렬 할 객체 정의 할 것이다 다음 x[i] 년대에 xtfrm 작품부터 지금

xx <- lapply(c(3,5,7,2,4), function(i) list(name=LETTERS[i], value=i)) 
class(xx) <- "myobj" 

을, 내가 원하는 요소를 여전히 가진 반환하는 [ 함수를 정의 할 필요가

`[.myobj` <- function(x, i) { 
    class(x) <- "list" 
    structure(x[i], class="myobj") 
} 

지금 우리가 myobj 클래스 ==> 기능을 필요

권리 클래스; 이것은 잠재적으로 이것을 적절하게 벡터화함으로써 더 똑똑해질 수 있습니다. 그러나 sort 함수의 경우, 우리는 길이가 1의 myobj을 전달할 것임을 알기 때문에 첫 번째 요소를 사용하여 관계를 정의합니다.

`>.myobj` <- function(e1, e2) { 
    e1[[1]]$value > e2[[1]]$value 
} 

`==.myobj` <- function(e1, e2) { 
    e1[[1]]$value == e2[[1]]$value 
} 

이제 sort이 작동합니다.

sort(xx) 

전체 Ops 함수를 작성하는 것이 더 적절할 수 있습니다. 그러나, 그냥 정렬하려면, 이것은 당신이 필요로하는 모든 것으로 보인다. S3 스타일을 사용하여이 작업을 수행하는 방법에 대한 자세한 내용은 Venables/Ripley의 p.89-90을 참조하십시오. 또한 객체에 대해 xtfrm 함수를 쉽게 작성할 수 있다면 더 간단하고 가능성이 더 빠릅니다.

+0

감사합니다. Aaron. 환상적인 대답. – Chris

+1

정규 R 비트로 생성 할 수있는 것보다 덜 일반적인 솔루션을 만드는 많은 작업이 있습니다. 다음은 'order'정렬의 두 가지 용도입니다. xx [order (as.character (sapply (xx, [ ","value "))]]'를 호출 한 다음, 이름에'xx [order (as.문자 (sapply (xx, "[", "name"))]] 클래스 메서드에 대한 참조없이. –

+0

@DWin은 절대적으로 옳습니다. 더 똑똑한 것을 할 수 있다면,해야합니다! – Aaron

4

order 함수를 사용하면 문자 또는 숫자 인수에 대한 정렬 순서를 결정하고 후속 인수로 구분할 수 있습니다. 당신은 당신이 원하는 것에 대해 더 구체적이어야합니다. "사소한 객체"의 예를 생성하고 일부 R 객체에서 원하는 순서를 지정하십시오. 목록 아마 대부분의 비의 vectorial 개체 :

> slist <- list(cc=list(rr=1), bb=list(ee=2, yy=7), zz="ww") 
> slist[order(names(slist))] # alpha order on names() 
$bb 
$bb$ee 
[1] 2 
$bb$yy 
[1] 7 
$cc 
$cc$rr 
[1] 1  
$zz 
[1] "ww" 

slist[c("zz", "bb", "cc")] # an arbitrary ordering 
$zz 
[1] "ww" 
$bb 
$bb$ee 
[1] 2 
$bb$yy 
[1] 7 
$cc 
$cc$rr 
[1] 1 
1

하나의 옵션은 객체의 xtfrm 방법을 만드는 것입니다. order과 같은 기능은 경우에 따라 작동하는 여러 열을 사용합니다. gtools 패키지에 특정 케이스 (예 : mixedsort)와 같은 특수 기능이 있습니다.

관련 문제