您好我正在尝试使用 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])