20

こんにちは、for ループを使用して変数に名前を付けようとしているので、変数の動的な名前を取得します。

for (i in 1:nX) {
    paste("X",i, sep="")=datos[,i+1]
    next
}
4

2 に答える 2

33

次のように使用assignします。

x <- 1:10

for(i in seq_along(x)){
  assign(paste('X', i, sep=''), x[i])
}
于 2012-12-29T13:11:46.180 に答える
12

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])
于 2012-12-29T13:28:14.493 に答える