2015年11月5日木曜日

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
 [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の強調表示とかで乗り切りましょう。

正直あまりエレガントな方法ではない気もしますが、文字列操作さえできればなんでもできるという、根拠のない自信を持つことはできました。





1 件のコメント:

  1. とても便利ですね。参考にさせていただきました。
    ひとつ疑問なのですが、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
    ...
    としたい場合は、どのように書けるのでしょうか?

    返信削除