いくつかの(数値)列を持つデータフレームがあり、列が元のランクである新しいデータフレームを作成したいと考えています。
> 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
トリックをしません。
あるいは、これを行う別の方法はありますか?