1. ホーム
  2. r

[解決済み] Rで空のベクトルに値を追加する?

2022-05-08 20:36:23

質問

Rを勉強しているのですが、リストに追加する方法がわかりません。

もしこれがPythonだったら......。

#Python
vector = []
values = ['a','b','c','d','e','f','g']

for i in range(0,len(values)):
    vector.append(values[i])

Rでこれを行うにはどうすればよいのでしょうか?

#R Programming
> vector = c()
> values = c('a','b','c','d','e','f','g')
> for (i in 1:length(values))
+ #append value[i] to empty vector

解決方法は?

このため、多くの人が「Rは遅い」「Rループは避けるべき」と言います。

として ブロディG コメントで言及されているように、必要な長さのベクトルを事前に確保し、ループ内で要素の値を設定する方がはるかによいです。

ベクターに値を追加する方法をいくつか紹介します。 いずれも推奨されません。

ループ内のベクトルへの加算

# one way
for (i in 1:length(values))
  vector[i] <- values[i]
# another way
for (i in 1:length(values))
  vector <- c(vector, values[i])
# yet another way?!?
for (v in values)
  vector <- c(vector, v)
# ... more ways

help("append") は、あなたの質問に答え、この質問を書くのにかかった時間を節約することができました(ただし、悪い習慣を身につけることになります);-)。

なお vector <- c() は空のベクトルではありません。 NULL . 空の文字ベクトルが必要な場合は vector <- character() .

ループする前にベクターをあらかじめ確保する

もし、あなたが どうしても を使用する場合は、ループの前にベクトル全体をあらかじめ割り当てておく必要があります。 これは、大きなベクトルでは加算よりもはるかに高速になります。

set.seed(21)
values <- sample(letters, 1e4, TRUE)
vector <- character(0)
# slow
system.time( for (i in 1:length(values)) vector[i] <- values[i] )
#   user  system elapsed 
#  0.340   0.000   0.343 
vector <- character(length(values))
# fast(er)
system.time( for (i in 1:length(values)) vector[i] <- values[i] )
#   user  system elapsed 
#  0.024   0.000   0.023