2011-09-22 13 views
10

Rでは、私は重要でないオブジェクトのリストを持っています(Rは順序を定義できると期待できるスカラーのような単純なオブジェクトではありません)。私はリストをソートしたい。ほとんどの言語では、ソート関数に渡される一対のリスト要素を比較する関数などをプログラマが提供することができます。どうすればリストを並べ替えることができますか?Rの中の重要でない要素のリストをソートR

+0

あなたは、この重要な要素リストのスニペットを提供して、他の人があなたが話していることを知ることができますか?再現性のある質問を書くヒント:http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – Chase

答えて

14

これを簡単に行うには、オブジェクトが名前と値の2つの要素を持つリストであるといいます。値は数値です。それは私たちが並べ替えたいものです。あなたはより多くの要素を持っていると想像することができます。

sortヘルプページには、sortにはxtfrmが使用されています。 xtfrmは、x[i]のクラスに対して==>メソッドを使用することを示しています。

まず私はソートしたいオブジェクト定義します:今

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

を、x[i]年代にxtfrm作品以来、私は希望の要素を返す[関数を定義する必要がありますが、それでもと右のクラス

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

今、私たちはmyobjクラスの==>機能を必要とします。これらを適切にベクトル化することで、よりスマートになる可能性があります。ソート関数の場合は、長さが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

ありがとうございました。素晴らしい答え。 – Chris

+1

これは、一般的なRビットで構築することができるよりも一般的ではない解決策を構築するための多くの作業です。これらは、最初に値を並べ替える2つの用途です: 'xx [order(as.character(sapply(xx、 ["、" value "))]]'を実行し、次に名前に '' xx [order(as。クラスメソッドへの参照なしで文字(sapply(xx、 "["、 "name"))]] –

+0

@DWinは絶対に正しいです。よりスマートに何かできるのなら、あなたはすべきです! – Aaron

4

関数orderを使用すると、文字または数値のアトリビュートと後続の引数を持つブレークタイのソート順を決定できます。あなたが望むものについてもっと具体的にする必要があります。 「些細でないオブジェクト」の例を作成し、あるRオブジェクトで望む順序を指定します。リストは、おそらくほとんどの非ベクトルオブジェクトである:

> 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

1つのオプションは、あなたのオブジェクトのxtfrm方法を作成することです。 orderのような機能は、場合によっては動作する複数の列を取ります。 gtoolsパッケージには、mixedsortのような特定のケースに特化した機能もいくつかあります。

関連する問題