重新编码数字向量R.

时间:2011-02-01 03:15:20

标签: r

我有一个数字向量,让我们说:

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 个答案:

答案 0 :(得分:5)

7 - x这样简单的东西不会给你你想要的东西吗?

答案 1 :(得分:5)

构造旧值和新值之间的映射,并使用旧值

构建子集
(6:1)[x]

答案 2 :(得分:4)

请参阅car::recode的手册。否则,创建变量y

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

在适当的位置重新编码变量一直被认为是一种不好的做法,因为如果你搞砸了,你可能会丢失数据。小心。

答案 3 :(得分:4)

在你的情况下,是的,只是减去。通常,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 :(得分:1)

rev(x) ...至少当长度是序列的偶数倍时。

答案 5 :(得分:0)

如果要重新编码多个变量,可以采用以下方法:

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...