2012-12-29 54 views
9

Xin chào, tôi đang cố gắng đặt tên biến bằng cách sử dụng vòng lặp for để tôi nhận được tên động cho các biến của mình.cách gán giá trị cho các biến tên động trong R

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

Tại sao bạn lại cố gắng thực hiện điều đó? Sử dụng mảng thay thế. – nico

+0

Xin chào, tôi có một khung dữ liệu với tiêu đề dài nhưng muốn tự động đặt các biến của riêng tôi là X1, X2, v.v. vì vậy tôi có thể hoạt động với riêng chúng – nopeva

+5

Tại sao bạn không thực hiện 'colNames (datos) <- paste ("X", i, sep = "") 'sau đó? Sau đó, bạn có thể truy cập chúng với 'datos $ X1',' datos $ X2' etc – nico

Trả lời

16

sử dụng assign như trong:

x <- 1:10 

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

Điều đó có hiệu quả, nhưng đó vẫn là một ý tưởng tồi. –

+0

Cảm ơn rất nhiều công trình là tốt. – nopeva

+0

Xin chào David, tại sao bạn nghĩ đó là một ý tưởng tồi? – nopeva

9

Nó có thể là một ý tưởng tốt để sử dụng assign khi có nhiều biến đổi và họ đang nhìn lên thường xuyên. Tìm kiếm trong môi trường nhanh hơn trong vectơ hoặc danh sách. Một môi trường riêng biệt cho các đối tượng dữ liệu là một ý tưởng tốt.

Một ý tưởng khác là sử dụng gói hash. Nó thực hiện tra cứu nhanh như môi trường, nhưng dễ sử dụng hơn.

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

Đây là một so sánh thời gian cho 10000 vars được ngẩng đầu lên 10^5 lần:

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

Tuy nhiên, phiên bản vectorized của phương pháp 1 là nhanh nhất, nhưng không phải lúc nào cũng áp dụng

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

trong phương pháp 3 x là gì? – agstudy

+0

oops, lỗi đánh máy, sửa lỗi. –

Các vấn đề liên quan