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

    返信削除
    返信
    1. コメントありがとうございます。管理人です。気付くのが遅くなりすみません。(コメントとかほとんどこないので・・・)

      複数の処理を入れたい場合は、それぞれの処理をセミコロンで区切った文字列を作ればうまくいきました。お試しあれ。

      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))
      }

      削除

コメントを投稿

このブログの人気の投稿

Rのグラフで軸の目盛りの刻み幅を変更する方法

Rで繰り返しを含む数列の生成(rep関数、seq関数)

reorderを使ってggplotの棒グラフの並び順を降順にする方法