Как присвоить значения динамическим именам переменных

r

42170 просмотра

2 ответа

775 Репутация автора

Привет, я пытаюсь назвать переменные, используя цикл for, поэтому я получаю динамические имена для моих переменных.

for (i in 1:nX) {
    paste("X",i, sep="")=datos[,i+1]
    next
}
Автор: nopeva Источник Размещён: 29.12.2012 01:07

Ответы (2)


23 плюса

46209 Репутация автора

Решение

использовать assignкак в:

x <- 1:10

for(i in seq_along(x)){
  assign(paste('X', i, sep=''), x[i])
}
Автор: Jilber Urbina Размещён: 29.12.2012 01:11

11 плюса

11771 Репутация автора

Это может быть хорошей идеей для использования, assignкогда имеется много переменных, и их часто ищут. Поиск в среде быстрее, чем в векторе или списке. Отдельная среда для объектов данных - хорошая идея.

Другая идея заключается в использовании hashпакета. Он выполняет поиск так же быстро, как окружение, но более удобен в использовании.

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

Вот временное сравнение для 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]])

Однако векторизованная версия метода 1 является самой быстрой, но не всегда применимой

# method 4, takes 0.02s
names(datos) <- paste("x", seq_along(datos), sep="")
system.time(datos[lookup])
Автор: Karsten W. Размещён: 29.12.2012 01:28
Вопросы из категории :
32x32