我需要遍历diagonal+1 (即对角线右侧的values 1列),并将值写入dataframe中的列:
write.csv(data.frame(matrix[1,2], matrix[2,3], matrix[3,4])
我如何使用一个函数来实现这一点,而不是仅仅列出所有值的位置?
发布于 2013-03-28 09:28:26
您可以使用矩阵进行索引。
例如
m <- matrix(1:25, ncol = 5)
可以使用以下命令访问非对角线
offd <- cbind(1:4,2:5)
m[offd]
## [1] 6 12 18 24
您可以创建一个执行此操作的函数
offdiag <- function(m, offset){
i <- seq_len(nrow(m)-offset)
j <- i + offset
m[cbind(i,j)]
}
offdiag(m, 1)
## [1] 6 12 18 24
offdiag(m, 2)
[1] 11 17 23
offdiag(m, 3)
## [1] 16 22
offdiag(m, 4)
## [1] 21
发布于 2013-03-28 10:07:52
一种快速的方法是使用经常被忽视的row()
和col()
函数,而不是通过编程来计算索引。对于矩阵中的每个元素,它们分别返回该元素所属的行或列。
对角线是元素的行索引等于列索引的位置。第一条次对角线表示行索引等于列索引加1,而第一条上对角线表示行索引等于列索引减1。
下面是一些示例:
m <- matrix(1:25, ncol = 5)
m
> m
[,1] [,2] [,3] [,4] [,5]
[1,] 1 6 11 16 21
[2,] 2 7 12 17 22
[3,] 3 8 13 18 23
[4,] 4 9 14 19 24
[5,] 5 10 15 20 25
对角线
m[row(m) == col(m)]
diag(m)
> m[row(m) == col(m)]
[1] 1 7 13 19 25
> diag(m) ## just to show this is correct
[1] 1 7 13 19 25
第一次对角线
m[row(m) == col(m) + 1
> m[row(m) == col(m) + 1]
[1] 2 8 14 20
第一超对角线
m[row(m) == col(m) -1]
> m[row(m) == col(m) -1]
[1] 6 12 18 24
可以通过增加添加到列索引的值来提取更高阶的超对角线和次对角线。
创建数据框并写出
从本质上讲,你已经有了这个,但是
write.csv(data.frame(m[row(m) == col(m) + 1), file = "subdiag.csv")
次对角线或超对角线的一般函数
diags <- function(m, type = c("sub", "super"), offset = 1) {
type <- match.arg(type)
FUN <-
if(isTRUE(all.equal(type, "sub")))
`+`
else
`-`
m[row(m) == FUN(col(m), offset)]
}
在使用中,我们有:
> diags(m)
[1] 2 8 14 20
> diags(m, type = "super")
[1] 6 12 18 24
> diags(m, offset = 2)
[1] 3 9 15
发布于 2013-03-28 09:52:51
取一个子矩阵,然后是它的对角线。
使用mnel的m
diag(m[, -1])
[1] 6 12 18 24
作为一个具有可变偏移量的函数(但在这种形式下,它并不比mnel的解决方案更干净):
offdiag <- function(m, offset) {
s <- seq(offset)
diag(m[,-s, drop=FALSE])
}
offdiag(m, 1)
## [1] 6 12 18 24
offdiag(m, 2)
## [1] 11 17 23
offdiag(m, 3)
## [1] 16 22
offdiag(m, 4)
## [1] 21
https://stackoverflow.com/questions/15672585
复制相似问题