如何在 R 中同时反转向量的特定范围?

How to reverse specific ranges of a vector at the same time in R?

例如,我有矩阵A,如下:

       [,1] [,2] [,3] [,4]
 [1,]    1    1    1    1
 [2,]    1    1    1    1
 [3,]    1    1    1    1
 [4,]    1    1    1    1
 [5,]    1    1    1    1
 [6,]    1    1    1    1
 [7,]    1    1    1    1
 [8,]    1    1   -1   -1
 [9,]    1    1   -1   -1
[10,]    1    1   -1   -1
[11,]    1    1   -1   -1
[12,]    1   -1    1   -1
[13,]    1   -1    1   -1
[14,]    1   -1    1   -1
[15,]    1   -1    1   -1
[16,]    1   -1   -1    1
[17,]    1   -1   -1    1
[18,]    1   -1   -1    1
[19,]    1   -1   -1    1

使用代码:

Y=unique(A[,3:4])
YY=list()
q=0
for( i in 1:nrow(Y) )
{
a=which(apply(A, 1, function(x) identical(x[3:4], Y[i,])))
if( length(a)>1 )
{
q=q+1
YY[[q]]=a
}}

我获得了矩阵 A 的第 3 列和第 4 列的范围,它们具有相同的元素。 即列表Y为:

YY
[[1]]
[1] 1 2 3 4 5 6 7
[[2]]
[1]  8  9 10 11
[[3]]
[1] 12 13 14 15
[[4]]
[1] 16 17 18 19

所以,假设我有向量 x=c(1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,1,-1,-1,1,1)。 由于列表 YYx 所需的还原如下: c(-1,1,1,1,1,1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,-1).

关键是要成功地反转一个矢量,范围尽可能多。

请注意,范围和数量可能会发生变化。

我尝试将 rev()apply() 一起使用,但它不起作用。

有什么想法吗?

尝试

x[unlist(sapply(YY, rev))]

这里实现了对YY的依赖,当YY变化时,顺序也会随之变化。