1

我得到了一个数字矩阵:

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

我需要这样的版本:

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

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

4

7 回答 7

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)
于 2013-07-16T14:30:25.770 回答
8

为了好玩,这里有一个替代方案(尽管@Jilber 的方法是我最初的想法)。

as.numeric(as.character(factor(x, labels = rev(unique(x)))))
# [1] 4 4 4 4 3 3 3 2 2 1
于 2013-07-16T14:34:29.197 回答
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
于 2013-07-16T14:38:42.213 回答
6

简约的方法:

(4:1)[x]
于 2013-07-16T16:04:23.547 回答
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
于 2013-07-16T14:48:56.643 回答
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
于 2013-07-16T15:12:27.857 回答
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以找到映射的结果。

于 2013-07-16T15:05:08.317 回答