2011-02-01 39 views
5

Tôi có một vector số, chúng ta hãy nói điều gì đó như:Recoding Numeric Vector R

x <- rep(1:6, 300) 

Những gì tôi muốn làm là mã hóa lại các vector, ở vị trí như vậy mà 6 = 1,5 = 2,4 = 3,3 = 4,2 = 5,1 = 6. Tôi không muốn tạo ra một yếu tố.

Tất cả những gì tôi đã cố gắng cho đến nay mang lại cho tôi đếm sai vì trình tự, ví dụ:

x[x == 6] <- 1 
x[x == 5] <- 2 ## Lines that follow where x[x == 2] removes 5's entirely from counts. 

Lưu ý: Tôi nhận thức được gói xe, nhưng muốn sử dụng cơ sở R cho vấn đề này .

+2

Tôi đoán tôi có thể tạo một cột mới và làm một cái gì đó giống như abs (7-x [1]) –

Trả lời

4

Xây dựng một bản đồ giữa các giá trị cũ và mới, và tập hợp con với người già,

(6:1)[x] 
+0

Phù hợp với nhiều hơn là trường hợp sử dụng cụ thể của tôi. –

4

Xem sách hướng dẫn cho car::recode. Nếu không, tạo biến y:

y <- numeric() 
length(y) <- length(x) 
y[x == 6] <- 1 
y[x == 5] <- 2 
## ad nauseam... 

Nó luôn luôn được coi là một thực tế xấu để recode biến tại chỗ, bởi vì nếu bạn làm mọi chuyện rối lên, bạn có thể sẽ bị mất dữ liệu. Hãy cẩn thận.

5

Chẳng phải đơn giản như 7 - x sẽ cho bạn biết bạn đang làm gì?

+0

Đôi khi, tôi tìm ra những điều này chỉ từ viết vấn đề của tôi ra f hoặc người khác trả lời! Cảm ơn! –

3

Trong trường hợp của bạn, có, chỉ cần trừ. Nói chung, match có thể khá hữu ích trong các trường hợp như thế này. Ví dụ, giả sử bạn muốn mã hóa lại các giá trị trong x cột này để các giá trị trong cột y

> d <- data.frame(x=c(1,3,4,5 ,6),y=c(3,4,2.2,1,4.6)) 
> print(d, row.names=FALSE) 
x y 
1 3.0 
3 4.0 
4 2.2 
5 1.0 
6 4.6 

Sau đó, điều này sẽ mã hóa lại các giá trị trong a với các giá trị mới.

> a <- c(3,4,6,1,5) 
> d$y[match(a,d$x)] 
[1] 4.0 2.2 4.6 3.0 1.0 
+0

'match' chỉ trả lại kết quả trùng khớp đầu tiên, do đó, điều này chỉ hoạt động nếu không có giá trị lặp lại. –

+0

Nhưng nếu có các giá trị lặp lại, làm cách nào chúng ta sẽ chọn giá trị nào để mã hóa lại? – Aaron

+0

Thực ra, đây là một vấn đề khác mà tôi đang gặp phải. Bây giờ tôi đã có phần này được sắp xếp. –

1

rev(x) ... ít nhất là khi độ dài là bội số của chuỗi.

+0

Điều đó không hiệu quả, bởi vì nó thay đổi thứ tự. –

+0

'> tất cả (rev (x) == (7-x)) # [1] TRUE' –

+0

chỉ đơn giản là một tạo phẩm của dữ liệu được tạo ở đây. Xem xét dữ liệu không được đặt hàng độc đáo: 'x <- c (1,1,2,3,4,5,6,1); tất cả (rev (x) == (7 - x)) ' – Chase

0

nếu bạn muốn mã hóa lại nhiều biến mà bạn có thể mất các phương pháp sau đây:

MapFunc = function(x) { 
    y = NULL; 
     if (x %in% c("1","2","3")) {y=100} 
     if (x %in% c("0","4")) {y=200} 
     if (x %in% c("5")) {y=100} 
    print(y) 
    } 
    MapFunc(x=1); MapFunc(x=0); #working ok for scalars 
#
X = matrix(sample(0:5,25,replace=TRUE), nrow=5,ncol=5) 
apply(X,c(1,2),MapFunc) #working ok for matrices... 
Các vấn đề liên quan