Rで、変数の値を変数名や列名にする
タイトルの意味分かりました?
例えば、x00, x01, x02, ..., x99 という名前の100個の変数を作りたいとか、それらに値を設定したいというときに使える方法です。(そんなシチュエーションがあるかどうかは別として)
上記の変数に、0, 1, 2, ..., 99 の値を設定したいとき、
x00 <- 0
x01 <- 1
x02 <- 2
...
x99 <- 99
を全部書けばいいわけですが、それは大変なので、下記のようにできます。
for(i in 0:99){
# 命令の文字列を作る
s <- paste("x", sprintf("%02d",i), " <- ", i, sep="")
# 文字列を命令として実行する
eval(parse(text=s))
}
ls() # x00~x99の100個の変数ができていることを確認
このevalとparseのコンビを、列名に使いたい場合は、↓こんな感じでどうでしょうか。
ちなみにRには"letters"なる定数が用意されていて、その中身にはaからzまでの文字が格納されています。
> letters
これらを列名にもつ、データフレームを作ってみましょう。
> s1 <- paste(letters, rep("=1:10", 26), sep="")
> s2 <- paste(s1, collapse=",")
> s3 <- paste("df <- data.frame(", s2, ")" )
> eval(parse(text=s3))
> df
ダブルクォートの何に予約語が入ると、何がなんだか分からなくなりますね。IDEの強調表示とかで乗り切りましょう。
正直あまりエレガントな方法ではない気もしますが、文字列操作さえできればなんでもできるという、根拠のない自信を持つことはできました。
例えば、x00, x01, x02, ..., x99 という名前の100個の変数を作りたいとか、それらに値を設定したいというときに使える方法です。(そんなシチュエーションがあるかどうかは別として)
上記の変数に、0, 1, 2, ..., 99 の値を設定したいとき、
x00 <- 0
x01 <- 1
x02 <- 2
...
x99 <- 99
を全部書けばいいわけですが、それは大変なので、下記のようにできます。
for(i in 0:99){
# 命令の文字列を作る
s <- paste("x", sprintf("%02d",i), " <- ", i, sep="")
# 文字列を命令として実行する
eval(parse(text=s))
}
ls() # x00~x99の100個の変数ができていることを確認
このevalとparseのコンビを、列名に使いたい場合は、↓こんな感じでどうでしょうか。
ちなみにRには"letters"なる定数が用意されていて、その中身にはaからzまでの文字が格納されています。
> letters
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
[11] "k" "l" "m" "n" "o" "p" "q" "r" "s" "t"
[21] "u" "v" "w" "x" "y" "z"
これらを列名にもつ、データフレームを作ってみましょう。
> s1 <- paste(letters, rep("=1:10", 26), sep="")
> s2 <- paste(s1, collapse=",")
> s3 <- paste("df <- data.frame(", s2, ")" )
> eval(parse(text=s3))
> df
a b c ... x y z
1 1 1 1 ... 1 1 1
2 2 2 2 ... 2 2 2
3 3 3 3 ... 3 3 3
4 4 4 4 ... 4 4 4
5 5 5 5 ... 5 5 5
6 6 6 6 ... 6 6 6
7 7 7 7 ... 7 7 7
8 8 8 8 ... 8 8 8
9 9 9 9 ... 9 9 9
10 10 10 10 ... 10 10 10
ダブルクォートの何に予約語が入ると、何がなんだか分からなくなりますね。IDEの強調表示とかで乗り切りましょう。
正直あまりエレガントな方法ではない気もしますが、文字列操作さえできればなんでもできるという、根拠のない自信を持つことはできました。
とても便利ですね。参考にさせていただきました。
返信削除ひとつ疑問なのですが、paste()の中に複数の処理を入れたい場合はどうすれば良いでしょうか。
例えば、上の例だと、
x00 <- 0
plot(x00)
dev.copy(bmp,file="00.bmp")
dev.off
x01 <- 1
plot(x01)
dev.copy(bmp,file="01.bmp")
dev.off
...
としたい場合は、どのように書けるのでしょうか?
コメントありがとうございます。管理人です。気付くのが遅くなりすみません。(コメントとかほとんどこないので・・・)
削除複数の処理を入れたい場合は、それぞれの処理をセミコロンで区切った文字列を作ればうまくいきました。お試しあれ。
for(i in 0:99){
ss <- paste("x", sprintf("%02d",i), " <- ", i, ";",
"plot (x", sprintf("%02d",i), ")", ";",
"dev.copy(bmp, file=\"", sprintf("%02d",i), ".bmp\")", ";",
"dev.off()", sep="")
eval(parse(text=ss))
}