假设我有一个这样的矩阵:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 1 3 5 7 9 11 13 15 17
[2,] 2 4 6 8 10 12 14 16 18
我正在寻找一种简单的方法来从第1和第2列减去第3列,然后从第4和第5列减去第6列,依此类推。
我可以在没有for循环的情况下这样做吗?
提前致谢, 蓁蓁。
答案 0 :(得分:3)
这个答案并不美观。它应该真正成为一个清晰的功能,但是:
m <- matrix(1:18,nrow=5,ncol=9, byrow=TRUE)
colsA <- (1:ncol(m))[1:ncol(m)%%3!=0]
colsB <- (1:ncol(m))[1:ncol(m)%%3==0]
m[,colsA] <- m[,colsA] - m[,rep(colsB,each=2)]
没有for循环!结果是:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] -2 -1 3 -2 -1 6 -2 -1 9
[2,] -2 -1 12 -2 -1 15 -2 -1 18
编辑:这里是一个函数
nth <- function(x,n) {
colsA <- (1:ncol(x))[1:ncol(x)%%n!=0]
colsB <- rep((1:ncol(x))[1:ncol(x)%%n==0], each=n-1)
x[,colsA] <- x[,colsA] - x[,colsB]
x
}
答案 1 :(得分:2)
这是一种方式。
首先我说明原则:
x <- matrix(1:20, nrow=2)
x[, seq(1, 7, 3)] <- x[, seq(1, 7, 3)] - x[, seq(3, 9, 3)]
x[, seq(2, 8, 3)] <- x[, seq(2, 8, 3)] - x[, seq(3, 9, 3)]
x
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] -4 -2 5 -4 -2 11 -4 -2 17 19
[2,] -4 -2 6 -4 -2 12 -4 -2 18 20
然后我定义了一个辅助函数,它可以减少输入:
myseq <- function(start, object=x){
seq(start, 3 * (ncol(x) %/% 3), 3)
}
x <- matrix(1:20, nrow=2)
x[, myseq(1)] <- x[, myseq(1)] - x[, myseq(3)]
x[, myseq(2)] <- x[, myseq(2)] - x[, myseq(3)]
x
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] -4 -2 5 -4 -2 11 -4 -2 17 19
[2,] -4 -2 6 -4 -2 12 -4 -2 18 20
答案 2 :(得分:0)
your_seq <- seq(from=3, to=ncol(your_matrix), by=3)
for(x in 1:length(your_seq)) {
col1 <- your_seq[x] - 1
col2 <- your_seq[x] - 2
your_matrix[,c(col1,col2)] <- your_matrix[,c(col1,col2)] - your_matrix[,your_seq[x]]
}