我希望交换数组中每一行的第二个。我事先不知道数组的长度。不过,我确实知道它可以被 2 整除。
举个例子:
101 102 147 148
会变成
102 101 148 147
任何帮助将不胜感激。
谢谢
迈克
假设你的向量(“数组”是 Fortran 语言)是
x
。
even <- seq(from=2, to=length(x), by=2)
odd <- even - 1
xnew <- x
xnew[even] <- x[odd]
xnew[odd] <- x[even]
您可以使代码更简洁,但这可能会让您更容易了解发生了什么。
这是一个函数版本,它将向量维度化为矩阵,然后交换每对轮并连接结果......
# 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
我猜使用 for 循环非常简单
for( i=0 ;i< arr.length;i+=2) { swap(arr[i],arr[i+1]) }
我在尝试交换矩阵中的每隔一行时发现了这个问题(如问题标题所示)。 这是我最终想出的方法。
> 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