2012-12-29 3 views
9

안녕하세요, 내 변수에 대한 동적 이름을 얻을 수 있도록 for 루프를 사용하여 변수의 이름을 지정하려고합니다.동적 이름에 값을 할당하는 방법 R

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

왜 그렇게하려고합니까? 대신 배열을 사용하십시오. – nico

+0

안녕하세요, 긴 헤더가있는 데이터 프레임이 있지만 X1, X2 등의 변수를 자동으로 설정하여 개별적으로 조작 할 수 있습니다. – nopeva

+5

왜 'colNames (datos) <- paste "X", i, 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"]] 

가 조회됩니다 만 바르에 대한 타이밍을 비교 한 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

오타, 오타가 발생했습니다. –

관련 문제