r - 在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
循环。
解决方案
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)
推荐阅读
- python - 单个按钮多个事件取决于其他按钮背景 tkinter
- android - 在表格布局中为表格行和列插入边框
- javascript - 如何在不重新加载整个应用程序的情况下获取异步数据
- typescript - 在 Angular 7 中注销后如何重新加载数据?
- ios - 在 Firebase 数据库中获取父级
- json - 如何将 json 字符串数据类型列转换为配置单元中的映射数据类型列?
- mysql - 无法在 knex 节点 express 中将 multipleStatements 设置为 true
- android - 无法在屏幕底角绘制矩形
- c# - 如何从使用 dapper 返回的复杂对象中修剪所有字符串
- mysql - MariaDb 复制