No.10345 空のベクトルを用意する場合  【波音】 2009/07/11(Sat) 21:45

Rではあまり気にしなくてもよいのかもしれませんが,for構文であるベクトルのi番目に数値を代入させていく場合:

# c()を使って空のベクトルを用意する
a <- c()
for(i in 1:10) a[i] <- i

# numeric()を使う
b <- numeric(10)
for(i in 1:10) b[i] <- i

のどちらを使うのが(プログラミングの)基本に忠実なやり方なのでしょうか。

Rは特に型を指定しない場合(dat <- c(1, 2, 3)などとした場合)は勝手にnumeric型として扱われるので,結局,a <- c()としてもb <- numeric(10)としても同じことなのでしょうか?

No.10346 Re: 空のベクトルを用意する場合  【青木繁伸】 2009/07/12(Sun) 07:21

二番目の方法が実行時間的には圧倒的に優れています。最も優れている方法は for を使わないというのは別として。実行時間は以下のようになります。
> n <- 1e5
> system.time({a <- NULL; for (i in 1:n) a[i] <- i})
ユーザ システム 経過
24.428 19.742 43.925
> system.time({a <- numeric(n); for (i in 1:n) a[i] <- i})
ユーザ システム 経過
0.353 0.002 0.376
> system.time(a <- 1:n)
ユーザ システム 経過
0.000 0.001 0.001
なお,最初のメモリー確保で別のタイプにしても違いはありません(最終的には最後に実行された結果により型は変わります)
> system.time({a <- numeric(n); for (i in 1:n) a[i] <- i})
ユーザ システム 経過
0.362 0.002 0.363
> class(a)
[1] "numeric"
> a[1:5]
[1] 1 2 3 4 5
> a[1] <- "abc"
> class(a)
[1] "character"
> a[1:5]
[1] "abc" "2" "3" "4" "5"

No.10348 Re: 空のベクトルを用意する場合  【波音】 2009/07/12(Sun) 17:29

回答ありがとうございます。

私の環境で同じく実行してみると:

> system.time({a <- NULL; for(i in 1:n) a[i] <- 1})
ユーザ システム 経過
85.31 0.01 85.89

> system.time({a <- numeric(n); for (i in 1:n) a[i] <- i})
ユーザ システム 経過
1.14 0.00 1.14

となりました(^_^;)

古 い方のパソコンだとユーザCPU時間から順に106.95, 0.12, 109.96となりましたが,単純に考えて100倍くらい時間が余分にかかるわけですから,これは確かに圧倒的にnumeric()を使う方が優れている のですね(大規模な計算プログラムを実行させる際にはより壊滅的ですね,,,)。

● 「統計学関連なんでもあり」の過去ログ--- 042 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る