4

私は次のコードを持っています、

z <- data.frame(a=sample.int(10),b=sample.int(10),c=sample.int(10))
letter <- c("a","c","b") # this will be used as the argument to a function
vec <- unlist(lapply(1:length(letter), 
              function(x) cat(paste("z[[letter[",x,"]]],",sep=""))))
vec[length(vec)] <- paste("z[[letter[",length(vec),"]]]",sep="")

その結果:

> vec    
[1] "z[[letter[1]]]," "z[[letter[2]]]," "z[[letter[3]]]" 

以下のコードを使用して、vecデータフレームの行を並べ替えるのに使用したいのですが、z

z.sort <- z[with(z, order(???)),]

vecの引数として評価される文字ベクトルを取得するにはどうすればよいorderですか?letter形成に使用さvecれる、が関数の引数になることを念頭に置いて、これを行うためのより良い方法はありますか?

必要な出力は次のようになります。

    a  b  c
5   1  1  9
10  2 10  2
1   3  7  1
9   4  2  5
8   5  8  6
2   6  4  3
4   7  9 10
3   8  3  8
6   9  5  7
7  10  6  4

またはdput出力として:

structure(list(a = 1:10, b = c(1L, 10L, 7L, 2L, 8L, 4L, 9L, 3L, 5L, 6L), c = c(9L, 2L, 1L, 5L, 6L, 3L, 10L, 8L, 7L, 4L)), .Names = c("a", "b", "c"), row.names = c(5L, 10L, 1L, 9L, 8L, 2L, 4L, 3L, 6L, 7L), class = "data.frame")
4

2 に答える 2

4

これがあなたが望むものです(異なるランダムデータで):

> z[do.call(order, z[,letter]),]
    a  b  c
5   1  2  1
4   2  4  8
1   3  3  9
6   4  6  3
8   5  8  5
10  6  1  4
2   7  5  7
3   8 10  2
9   9  7  6
7  10  9 10

do.call引数として関数にリストを送信できるので、の列を並べ替えて、を使用しzて送信できます。これは、単なる特別な種類のリストです。orderdo.calldata.frame

関数で問題なく動作します:

my.reorder <- function(dat, cols) { dat[do.call(order, dat[,cols]),] }
于 2012-04-19T16:53:15.207 に答える
0

あなたの行動が大いに役立つことについてもう少し明確にしますが、いくつかの考え...

呼び出しでは、sapply次を使用して劇的に簡素化できます。

vec <- sapply(letter, function(x) paste('z[["',x,'"]]',sep=''))

出力を表示して割り当てようとしない限り、猫のステップは不要です...しかし、を使用する2行の関数を使用することをお勧めしますprint。を使用して、話している並べ替えを取得できますeval(parse(text=...))

z[order(eval(parse(text=vec[1])),]

そして、各ソートをリストとして取得します:

lapply(vec, function(x) z[order(eval(parse(text=x))),])

しかし...文字で指定された各列でdata.frameをソートすることが目標の場合:

lapply(letter, function(x) z[order(z[[x]]),])

上記のすべての面倒な手順と同じ出力が得られます。のようなものをeval(parse(text=...))頻繁に使用することは、何かばかげたことをしていることを意味し、より簡単な解決策がある可能性が非常に高いため、手順を再考する必要があります。

于 2012-04-19T16:28:30.303 に答える