3

いくつかの(数値)列を持つデータフレームがあり、列が元のランクである新しいデータフレームを作成したいと考えています。

> df <- data.frame(cbind(id=LETTERS[1:10],  
wheat=c(123,234,345,456,678,987,876,654,432,321),barley=c(135,975,246,864,357,753,468,642,579,531)))
> df
   id wheat barley
1   A   123    135
2   B   234    975
3   C   345    246
4   D   456    864
5   E   678    357
6   F   987    753
7   G   876    468
8   H   654    642
9   I   432    579
10  J   321    531
> rankeddf <- transform(df, wheat=rank(wheat), barley=rank(barley))
> rankeddf
   id wheat barley
1   A     1      1
2   B     2     10
3   C     4      2
4   D     6      9
5   E     8      3
6   F    10      8
7   G     9      4
8   H     7      7
9   I     5      6
10  J     3      5

問題は、列の数と名前が異なることです。それらを指定するベクトルがあります:

cols <- c("wheat", "barley")

transformその場でステートメントを作成するにはどうすればよいですか? または、colsベクトルをループして、transform反復ごとにステートメントを 1 回適用しますか? eval答えはorと何か関係があると思いますevalqが、まだよくわかりません。例えば、

> rankeddf2 <- df
> for (col in cols) {rankeddf2 <- transform(rankeddf2, evalq(paste(col,"=rank(",col,")",sep="")))}
> rankeddf2
   id wheat barley
1   A   123    135
2   B   234    975
3   C   345    246
4   D   456    864
5   E   678    357
6   F   987    753
7   G   876    468
8   H   654    642
9   I   432    579
10  J   321    531

トリックをしません。

あるいは、これを行う別の方法はありますか?

4

2 に答える 2

6

lapplyと を使用してこれを行うことができますrank()

as.data.frame(lapply(df[, cols], rank))
   wheat barley
1      1      1
2      2     10
3      4      2
4      6      9
5      8      3
6     10      8
7      9      4
8      7      7
9      5      6
10     3      5

OK、その過程で最初の列を失いますが、それを元に戻すのは簡単です:

data.frame(id=df[[1]], lapply(df[, cols], rank))
   id wheat barley
1   A     1      1
2   B     2     10
3   C     4      2
4   D     6      9
5   E     8      3
6   F    10      8
7   G     9      4
8   H     7      7
9   I     5      6
10  J     3      5
于 2012-10-21T17:57:47.093 に答える
4

私はtransform()、関連するwith()andwithin()をシンタックス シュガーとして考えるのが好きです。これらはトップレベルでインタラクティブに役立ちますが、かなり頻繁に、 などを介したサブセット化と置換は'['()'[<-'()次のようなジョブにより使いやすいです。

> df2 <- df ## copy
> df2[, cols] <- apply(df[, cols], 2, rank)
> df2
   id wheat barley
1   A     1      1
2   B     2     10
3   C     4      2
4   D     6      9
5   E     8      3
6   F    10      8
7   G     9      4
8   H     7      7
9   I     5      6
10  J     3      5

'['()そして、'[<-'()すでにあなたが望むことをしているのでtransform()、サブセット化機能と置換機能を使用して、すでに実装されていることをより簡単に実行しようとしています。

于 2012-10-21T18:50:28.630 に答える