こんにちは、for ループを使用して変数に名前を付けようとしているので、変数の動的な名前を取得します。
for (i in 1:nX) {
paste("X",i, sep="")=datos[,i+1]
next
}
こんにちは、for ループを使用して変数に名前を付けようとしているので、変数の動的な名前を取得します。
for (i in 1:nX) {
paste("X",i, sep="")=datos[,i+1]
next
}
次のように使用assign
します。
x <- 1:10
for(i in seq_along(x)){
assign(paste('X', i, sep=''), x[i])
}
assign
多くの変数があり、それらが頻繁に検索される場合に使用することをお勧めします。環境でのルックアップは、ベクターまたはリストよりも高速です。データ オブジェクト用に別の環境を用意することをお勧めします。
別のアイデアは、hash
パッケージを使用することです。環境と同じくらい高速にルックアップを実行しますが、より快適に使用できます。
datos <- rnorm(1:10)
library(hash)
h <- hash(paste("x", 1:10, sep=""), datos)
h[["x1"]]
以下は、10^5 回検索される 10000 変数のタイミング比較です。
datos <- rnorm(1:10000)
lookup <- paste("x", sample.int(length(datos), 100000, replace=TRUE), sep="")
# method 1, takes 16s on my machine
names(datos) <- paste("x", seq_along(datos), sep="")
system.time(for(key in lookup) datos[[key]])
# method 2, takes 1.6s on my machine
library(hash)
h <- hash(paste("x", seq_along(datos), sep=""), datos)
system.time(for(key in lookup) h[[key]])
# method 3, takes 0.2s on my machine
e <- new.env()
for(i in seq_along(datos)){
assign(paste('x', i, sep=''), datos[i], envir=e)
}
system.time(for(key in lookup) e[[key]])
ただし、方法 1 のベクトル化されたバージョンが最も高速ですが、常に適用できるとは限りません。
# method 4, takes 0.02s
names(datos) <- paste("x", seq_along(datos), sep="")
system.time(datos[lookup])