我得到了一个数字矩阵:
x<-c(1,1,1,1,2,2,2,3,3,4)
我需要这样的版本:
x<-c(4,4,4,4,3,3,3,2,2,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)
它只是第一个数组的反转版本。除了蛮力循环之外,还有其他有效的方法吗?
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)
为了好玩,这里有一个替代方案(尽管@Jilber 的方法是我最初的想法)。
as.numeric(as.character(factor(x, labels = rev(unique(x)))))
# [1] 4 4 4 4 3 3 3 2 2 1
这是另一种使用方法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
简约的方法:
(4:1)[x]
让我们将此动作解释为镜像:
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
这个怎么样:
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
我喜欢 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
以找到映射的结果。