2011-10-11 20 views
7

data.frameを列番号でソートする必要のあるアプリケーションが発生しましたが、usual solutionsのどれもそれを許可していないようです。リストの順序

コンテキストはas.data.frame.byメソッドを作成しています。 byオブジェクトは、最後の列を値列として、最初のncol-1列をインデックス列として持つためです。 meltはそれを後方にソートして返します。インデックス3、次にインデックス2、インデックス1です。latex.table.byとの互換性のため、前方に並べ替えたいと思います。しかし、私はそれを十分に一般的なやり方でやっているのです。以下の関数のコメントアウトされた行はこれまでの私の最高の試みです。非コメント行で

as.data.frame.by <- function(x, colnames=paste("IDX",seq(length(dim(x))),sep=""), ...) { 
    num.by.vars <- length(dim(x)) 
    res <- melt(unclass(x)) 
    res <- na.omit(res) 
    colnames(res)[seq(num.by.vars)] <- colnames 
    #res <- res[ order(res[ , seq(num.by.vars)]) , ] # Sort the results by the by vars in the heirarchy given 
    res 
} 

dat <- transform(ChickWeight, Time=cut(Time,3), Chick=cut(as.numeric(Chick),3)) 
my.by <- by(dat, with(dat,list(Time,Chick,Diet)), function(x) sum(x$weight)) 
> as.data.frame(my.by) 
      IDX1   IDX2 IDX3 value 
1 (-0.021,6.99] (0.951,17.3] 1 3475 
2  (6.99,14] (0.951,17.3] 1 5969 
3  (14,21] (0.951,17.3] 1 8002 
4 (-0.021,6.99] (17.3,33.7] 1 640 
5  (6.99,14] (17.3,33.7] 1 1596 
6  (14,21] (17.3,33.7] 1 2900 
13 (-0.021,6.99] (17.3,33.7] 2 2253 
14  (6.99,14] (17.3,33.7] 2 4734 
15  (14,21] (17.3,33.7] 2 7727 
22 (-0.021,6.99] (17.3,33.7] 3 666 
23  (6.99,14] (17.3,33.7] 3 1391 
24  (14,21] (17.3,33.7] 3 2109 
25 (-0.021,6.99] (33.7,50] 3 1647 
26  (6.99,14] (33.7,50] 3 3853 
27  (14,21] (33.7,50] 3 7488 
34 (-0.021,6.99] (33.7,50] 4 2412 
35  (6.99,14] (33.7,50] 4 5448 
36  (14,21] (33.7,50] 4 8101 

、それは(それだけ悲惨な結果と、ベクトルとして全体data.frameを扱う)意味不明を返します。

私はさらにres <- res[ order(...=list(res[,1],res[,2])) , ]のような巧妙なものを試しましたが、役に立たないです。

私はこれを行う簡単な方法があると思うが、私はそれを見ていない。

説明のために編集:列名を指定する必要はありません。代わりに、私は数値ベクトル(例えば列1:4による並べ替え)で並べ替えることができるようにしたい。

答えて

7
mydf <- as.data.frame(my.by) 
mydf[order(mydf$IDX3, mydf$IDX2, mydf$IDX1) , ] 
      IDX1   IDX2 IDX3 value 
1 (-0.021,6.99] (0.951,17.3] 1 3475 
3  (14,21] (0.951,17.3] 1 8002 
2  (6.99,14] (0.951,17.3] 1 5969 
4 (-0.021,6.99] (17.3,33.7] 1 640 
6  (14,21] (17.3,33.7] 1 2900 
5  (6.99,14] (17.3,33.7] 1 1596 
13 (-0.021,6.99] (17.3,33.7] 2 2253 
15  (14,21] (17.3,33.7] 2 7727 
14  (6.99,14] (17.3,33.7] 2 4734 
22 (-0.021,6.99] (17.3,33.7] 3 666 
24  (14,21] (17.3,33.7] 3 2109 
23  (6.99,14] (17.3,33.7] 3 1391 
25 (-0.021,6.99] (33.7,50] 3 1647 
27  (14,21] (33.7,50] 3 7488 
26  (6.99,14] (33.7,50] 3 3853 
34 (-0.021,6.99] (33.7,50] 4 2412 
36  (14,21] (33.7,50] 4 8101 
35  (6.99,14] (33.7,50] 4 5448 

または、

my.by <- by(dat, with(dat,list(Diet,Chick, Time)), function(x) sum(x$weight)) 
mydf <- as.data.frame(my.by) 

EDIT:それとも、これは数値列のインデックスを使用してトップアップと同じ出力を生成します。

mydf <- as.data.frame(my.by) 
mydf[ do.call(order, mydf[, 3:1]) , ] 
+0

申し訳ありませんが明確にされている必要があります:私は、列名を指定する必要はありませんしたいと思います。代わりに、私は数値ベクトル(例えば列1:4による並べ替え)で並べ替えることができるようにしたい。 –

+0

上記を参照してください。データフレームを 'order'に渡すdo.callメソッドは' help(order) 'ページに示されています。 –

+0

ニース。ありがとう。 'do.call'をさらに詳しく調べる必要があります。私はそれが私の問題の多くを解決すると思っています:-) –

関連する問題