反向数组编号

时间:2013-07-16 14:27:17

标签: r

我有一个数字矩阵:

x<-c(1,1,1,1,2,2,2,3,3,4)

我需要这样的版本:

x<-c(4,4,4,4,3,3,3,2,2,1)

它只是第一个数组的反转版本。除了可能是强力循环之外,还有其他有效方法吗?

7 个答案:

答案 0 :(得分:8)

repunique的组合可以解决问题:

> x<-c(1,1,1,1,2,2,2,3,3,4)
> y <- rev(unique(x)) # Reversing elements
> rep(y,y)  
 [1] 4 4 4 4 3 3 3 2 2 1

您也可以使用rle,如下所示:

>z <- rev(rle(x)$values)
>rep(z, z)
 [1] 4 4 4 4 3 3 3 2 2 1

只是为了好玩,使用table也可以帮助您

>y <- as.numeric(rev(names(table(x))))
>rep(y, y)

答案 1 :(得分:8)

为了好玩,这里有另一种选择(虽然@Jilber的方法是我最初的想法)。

as.numeric(as.character(factor(x, labels = rev(unique(x)))))
# [1] 4 4 4 4 3 3 3 2 2 1

答案 2 :(得分:6)

这是使用rle

的另一种方法
x <- c(2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4,4,4,4,5,5,5,5,5,6,6,6,6,7,7,7,8,8,9)
myrle <- rle(x)
myrle$values <- rev(myrle$values)
inverse.rle(myrle)
[1] 9 9 9 9 9 9 9 9 8 8 8 8 8 8 8 7 7 7 7 7 7 6 6 6 6 6 5 5 5 5
[31] 4 4 4 3 3 2

如果在未排序的数据中,例如在@eddi新示例中,我们可以对数据进行排序,然后应用基本相同的方法

x <- c(1,1,1,2,2,1,1,5,5,3,3)
myrle <- rle(sort(x))
ind <- match(x, sort(x))
myrle$values <- rev(myrle$values)
inverse.rle(myrle)[ind]
[1] 5 5 5 3 3 5 5 1 1 2 2

答案 3 :(得分:6)

一种简约的方法:

(4:1)[x]

答案 4 :(得分:5)

让我们将此动作解释为镜像:

x<-c(1,1,1,1,2,2,2,3,3,4)

mirrorfun <- function(x, axis)  axis-(x-axis)

mirrorfun(x,mean(unique(x)))
#[1] 4 4 4 4 3 3 3 2 2 1

y<-c(2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4,4,4,4,5,5,5,5,5,6,6,6,6,7,7,7,8,8,9)
mirrorfun(y,mean(unique(y)))
#[1] 9 9 9 9 9 9 9 9 8 8 8 8 8 8 8 7 7 7 7 7 7 6 6 6 6 6 5 5 5 5 4 4 4 3 3 2

答案 5 :(得分:4)

这个怎么样:

x<-c(1,1,1,1,2,2,2,3,3,4)
5-x

甚至更好:

x<-c(1,1,1,1,2,2,2,3,3,4)
max(x)+1-x

答案 6 :(得分:1)

我喜欢Ananda的解决方案,除了它将数字转换为字符然后返回。到目前为止,它实际上是唯一一个正确映射比OP稍微复杂的东西,例如x = c(1,1,1,2,2,1,1,5,5,3,3)(映射将为1<->52<->3 - 注意:这实际上是OP的唯一解释,对排序序列之外的任何内容都有意义。)

执行映射的另一种方法是,不转换为因子如下:

library(data.table)

x = c(1,1,1,2,2,1,1,5,5,3,3)
data.table(x.in = unique(x), key = 'x.in')[, x.out := rev(x.in)][J(x)][, x.out]
#[1] 5 5 5 3 3 5 5 1 1 2 2

上面做的是,它创建一个data.table,其中包含来自x的唯一值,键(并因此排序),创建映射(这与排序的唯一值相反) ,然后与x合并以查找映射结果。