我有一个数字矩阵:
x<-c(1,1,1,1,2,2,2,3,3,4)
我需要这样的版本:
x<-c(4,4,4,4,3,3,3,2,2,1)
它只是第一个数组的反转版本。除了可能是强力循环之外,还有其他有效方法吗?
答案 0 :(得分:8)
rep
和unique
的组合可以解决问题:
> 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<->5
和2<->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
合并以查找映射结果。