Запись числового вектора R - PullRequest
6 голосов
/ 01 февраля 2011

У меня есть числовой вектор, скажем, что-то вроде:

x <- rep(1:6, 300)

То, что я хотел бы сделать, это перекодировать вектор так, чтобы 6 = 1,5 = 2,4 = 3,3 = 4,2 = 5,1 = 6 Я не хочу создавать фактор из этого.

Все, что я до сих пор пробовал, дает мне неправильный счет из-за порядка, то есть:

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

Примечание. Я знаю об автомобиле, но для этой задачи предпочел бы использовать базу R.

Ответы [ 6 ]

5 голосов
/ 01 февраля 2011

Построить карту между старыми и новыми значениями и подмножество со старыми,

(6:1)[x]
5 голосов
/ 01 февраля 2011

Разве что-то такое простое, как 7 - x, не даст вам того, что вы ищете?

4 голосов
/ 01 февраля 2011

В вашем случае, да, просто вычтите. В целом, match может быть весьма полезным в подобных случаях. Например, предположим, что вы хотите перекодировать значения в этом столбце x в значения в столбце 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

Тогда это перекодирует значения в a в новые значения.

> a <- c(3,4,6,1,5)
> d$y[match(a,d$x)]
[1] 4.0 2.2 4.6 3.0 1.0
4 голосов
/ 01 февраля 2011

См. Руководство для car::recode. В противном случае создайте переменную y:

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

Всегда считается плохой практикой перекодировать переменные на месте, потому что если вы все испортите, вы, вероятно, потеряете данные. Будьте осторожны.

1 голос
/ 01 февраля 2011

rev(x) ... по крайней мере, если длина кратна последовательности.

0 голосов
/ 07 октября 2012

Если вы хотите перекодировать несколько переменных, вы можете использовать следующий подход:

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... 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...