R:交换数组中的每隔一行

问题描述 投票:0回答:4

我希望交换数组中每一行的第二个。我事先不知道数组的长度。不过,我确实知道它可以被 2 整除。

举个例子:

101 102 147 148

会变成

102 101 148 147

任何帮助将不胜感激。

谢谢

迈克

r rows swap
4个回答
5
投票

假设你的向量(“数组”是 Fortran 语言)是

x

even <- seq(from=2, to=length(x), by=2)
odd <- even - 1
xnew <- x
xnew[even] <- x[odd]
xnew[odd] <- x[even]

您可以使代码更简洁,但这可能会让您更容易了解发生了什么。


1
投票

这是一个函数版本,它将向量维度化为矩阵,然后交换每对轮并连接结果......

#  Your data
x <- c( 101 , 102 , 147 , 148 )

#  Simple function
swap <- function(x){
  c( apply( t( matrix( x , length( x ) /2  , byrow = TRUE ) ) , 2 , rev ) )
}

swap( x )
# [1] 102 101 148 147

swap( 1:10 )
# [1]  2  1  4  3  6  5  8  7 10  9

这是第二种更快的解决方案,它消除了

apply
的使用并使用完全矢量化操作...

swap2 <- function(x){
  id <- seq_along( x ) %% 2 == 0
  c( t( matrix( c(x[id],x[!id]) , sum(id) ) ) )
}

swap2(1:10)
# [1]  2  1  4  3  6  5  8  7 10  9

0
投票

我猜使用 for 循环非常简单

for( i=0 ;i< arr.length;i+=2) { swap(arr[i],arr[i+1]) }


0
投票

我在尝试交换矩阵中的每隔一行时发现了这个问题(如问题标题所示)。 这是我最终想出的方法。

> x <- matrix(1:12, nrow=4)
     [,1] [,2] [,3]
[1,]    1    5    9
[2,]    2    6   10
[3,]    3    7   11
[4,]    4    8   12

> x[1:nrow(x)+c(1,-1),]
     [,1] [,2] [,3]
[1,]    2    6   10
[2,]    1    5    9
[3,]    4    8   12
[4,]    3    7   11

受西蒙回答的启发,这创建了一个行号的交替列表,例如

c(2, 1, 4, 3)
,然后按顺序返回矩阵。

要在向量上使用它,

> x <- c(101, 102, 147, 148)
> x[1:length(x)+c(1,-1)]
[1] 102 101 148 147
© www.soinside.com 2019 - 2024. All rights reserved.