2012-12-29 29 views
9

您好我正在嘗試使用for循環來命名變量,以便爲變量獲取動態名稱。如何爲R中的動態變量名賦值0

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

你爲什麼要這麼做?改用數組。 – nico

+0

嗨,我有一個長頭數據框,但想自動設置我自己的變量作爲X1,X2等,所以我可以與他們單獨操作 – nopeva

+5

爲什麼不只是'colNames(datos)< - 粘貼( 「X」,我,sep =「」)'那麼?然後你可以用'datos $ X1','datos $ X2'等等來訪問它們。 – nico

回答

16

使用assign爲:

x <- 1:10 

for(i in seq_along(x)){ 
    assign(paste('X', i, sep=''), x[i]) 
} 
+15

這有效,但它仍然是一個壞主意。 –

+0

非常感謝,這也適用。 – nopeva

+0

嗨大衛,你爲什麼認爲這是一個壞主意? – nopeva

9

它可以是一個好主意,用assign當有許多變量,它們經常擡起頭來。在環境中查找比在矢量或列表中查找更快。數據對象的單獨環境是一個好主意。

另一個想法是使用hash包。它執行的查找速度與環境一樣快,但使用起來更舒適。

datos <- rnorm(1:10) 
library(hash) 
h <- hash(paste("x", 1:10, sep=""), datos) 
h[["x1"]] 

這裏是被查找10000個VARS的時序對比10^5倍:

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]) 
+0

在方法3什麼是x? – agstudy

+0

哎呀,一個錯字,修復它。 –