2010-10-11 40 views
12

Tôi muốn thay thế các giá trị trong một vector (x) bằng các giá trị từ một véc tơ khác (y). Bắt 22: Các phương thức cần phải linh động để chứa số "cấp độ" khác nhau trong vector x. Ví dụ: xem xét vector xthay thế các giá trị trong một vector dựa trên một vector khác

x <- sample(c(1, 2, 3, 4, 5), 100, replace = TRUE) 
> x 
    [1] 2 4 1 1 3 1 1 1 1 1 2 2 5 5 4 5 5 3 4 1 2 2 3 3 3 5 1 3 4 5 5 3 2 4 3 1 3 
[38] 1 4 5 4 1 4 5 4 5 2 4 2 5 3 4 3 1 2 1 1 5 1 4 2 2 5 2 2 4 5 2 4 5 2 5 4 1 
[75] 3 3 4 4 1 1 4 4 2 4 5 4 5 5 4 2 5 2 4 5 3 2 1 1 2 2 

nơi tôi muốn thay thế 1 bằng 100, 2 với 200 và cứ tiếp tục như vậy.

Điều này có thể được thực hiện dễ dàng với vòng lặp for nhưng đối với các vectơ lớn, vài nghìn giá trị, điều này là không hiệu quả. Bất kỳ mẹo nào để tối ưu hóa mã?

x <- sample(c(1, 2, 3, 4, 5), 100, replace = TRUE) 
y <- c(100, 200, 300, 400, 500) 
x.lvl <- c(1, 2, 3, 4, 5) 
x.temp <- x 

for (i in 1:length(y)) { 
    x.temp[which(x == x.lvl[i])] <- y[i] 
} 

Trả lời

6

Làm việc với các yếu tố có thể là nhanh hơn:

xf <- as.factor(x) 
y[xf] 

Lưu ý, rằng levels(xf) mang đến cho bạn một vector nhân vật tương tự như x.lvl của bạn. Do đó, để phương thức này hoạt động, các phần tử của y phải tương ứng với các phần tử thích hợp của levels(xf).

+2

Trong ví dụ đồ chơi thậm chí bạn có thể sử dụng y [x] –

+2

Hoặc, chỉ cần x * 100 :) – VitoshKa

+0

Perfect. Nó hoạt động ngay cả khi không chuyển đổi thành một yếu tố và phát hiện nếu x có nhiều "cấp độ" hơn so với dự kiến ​​của y. –

16

Hãy thử với match

y[match(x, x.lvl)] 
+0

Bạn không cần khớp. chỉ cần sử dụng y [x] –

+5

@Mahbub Trong trường hợp này có nhưng nhìn chung bạn cần khớp (ví dụ: nếu 'x' là vectơ của các chữ cái). Kiểm tra bình luận bên dưới câu trả lời VitoshKa. – Marek

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