2012-12-29 10 views
9

Witam Próbuję nazwać zmienne za pomocą pętli for, więc otrzymuję dynamiczne nazwy dla moich zmiennych.jak przypisać wartości do dynamicznych nazw zmiennych w R

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

Dlaczego próbujesz to zrobić? Zamiast tego użyj tablicy. – nico

+0

Witam, mam ramkę danych z długimi nagłówkami, ale chciałbym automatycznie ustawić własne zmienne jako X1, X2, itd., Dzięki czemu mogę obsługiwać je indywidualnie – nopeva

+5

Dlaczego po prostu nie wykonasz 'colNames (datos) <- paste ("X", i, sep = "") ", a następnie? Następnie możesz uzyskać do nich dostęp za pomocą 'datos $ X1',' datos $ X2' itd. – nico

Odpowiedz

16

użycie assign jak w:

x <- 1:10 

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

To działa, ale nadal jest to zły pomysł. –

+0

Dziękuję bardzo, że działa również. – nopeva

+0

Witaj Davidzie, dlaczego uważasz, że to zły pomysł? – nopeva

9

To może być dobry pomysł, aby użyć assign gdy istnieje wiele zmiennych i ich wzrok często. Wyszukiwanie w środowisku jest szybsze niż w wektorze lub na liście. Osobnym środowiskiem dla obiektów danych jest dobry pomysł.

Innym pomysłem jest użycie pakietu hash. Wykonuje wyszukiwanie tak szybko, jak środowiska, ale jest wygodniejszy w użyciu.

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

Powyżej znajduje się Porównanie terminy 10000 Vars, które są wzrok 10^5 razy:

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

Jednak vectorized wersja metody 1 jest najszybszy, ale nie zawsze jest stosowane

# method 4, takes 0.02s 
names(datos) <- paste("x", seq_along(datos), sep="") 
system.time(datos[lookup]) 
+0

w metodzie 3, co to jest x? – agstudy

+0

Ups, literówka, poprawiono. –

Powiązane problemy