首页 > 解决方案 > 在R中的两个矩阵之间切换行

问题描述

让矩阵 A 和 B.

A=c(1:5)*matrix(1,5,5)
B=10*A

那是,

> A
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    1    1    1
[2,]    2    2    2    2    2
[3,]    3    3    3    3    3
[4,]    4    4    4    4    4
[5,]    5    5    5    5    5

> B
     [,1] [,2] [,3] [,4] [,5]
[1,]   10   10   10   10   10
[2,]   20   20   20   20   20
[3,]   30   30   30   30   30
[4,]   40   40   40   40   40
[5,]   50   50   50   50   50

例如,我想在矩阵 A 和 B 之间切换第一行,即

> A
     [,1] [,2] [,3] [,4] [,5]
[1,]   10   10   10   10   10
[2,]    2    2    2    2    2
[3,]    3    3    3    3    3
[4,]    4    4    4    4    4
[5,]    5    5    5    5    5

> B
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    1    1    1
[2,]   20   20   20   20   20
[3,]   30   30   30   30   30
[4,]   40   40   40   40   40
[5,]   50   50   50   50   50

使用函数,并且不使用任何中间向量或for循环。

标签: rmatrixvectorrow

解决方案


replace似乎无需任何中间体即可工作

replace(A, cbind(1, 1:ncol(A)), B[1,])
replace(B, cbind(1, 1:ncol(A)), A[1,])

请注意,一旦我们对原始对象进行了分配,第二次分配就不可能了,因为原始对象已更改


一种干净的交换方法是创建一个临时对象,rm然后

tmp <- A[1,]
A[1, ] <- B[1, ]
B[1, ] <- tmp
rm(tmp)
gc()

或者可能创建一个函数,并在函数内部进行交换,因此一旦退出函数,激活记录就会被删除(因为这些是按值传递的)

f1 <- function(a, b) {
       t1 <- a[1,]
       a[1,] <- b[1,]
       b[1,] <- t1
       return(list(a, b))
    }
list2env(setNames(f1(A, B), c('A', 'B')), .GlobalEnv)

推荐阅读