如何为动态名称变量赋值

nop*_*eva 14 r

嗨,我正在尝试使用for循环命名变量,所以我获得了变量的动态名称.

for (i in 1:nX) {
    paste("X",i, sep="")=datos[,i+1]
    next
}
Run Code Online (Sandbox Code Playgroud)

Jil*_*ina 23

用途assign如下:

x <- 1:10

for(i in seq_along(x)){
  assign(paste('X', i, sep=''), x[i])
}
Run Code Online (Sandbox Code Playgroud)

  • @ user1228124经验丰富的R程序员通常建议不要使用`assign`,除非你绝对被迫.在这种情况下,nico建议使用`colnames <-`更安全,更简单,更容易理解. (2认同)

Kar*_* W. 11

assign当存在许多变量并且经常查找它们时使用它是个好主意.环境中的查找比向量或列表中的查找更快.数据对象的单独环境是个好主意.

另一个想法是使用hash包.它以与环境一样快的速度执行查找,但使用起来更加舒适.

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

这是10000个变量的时间比较,查找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]])
Run Code Online (Sandbox Code Playgroud)

但是,方法1的矢量化版本是最快的,但并不总是适用

# method 4, takes 0.02s
names(datos) <- paste("x", seq_along(datos), sep="")
system.time(datos[lookup])
Run Code Online (Sandbox Code Playgroud)