R:如何在矩阵/数据帧中减去前面的第n列?

时间:2011-08-11 19:44:25

标签: r

假设我有一个这样的矩阵:

     [,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循环的情况下这样做吗?

提前致谢,    蓁蓁。

3 个答案:

答案 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]]
}