R: Как вычесть каждый n-й столбец из предшествующих ему в матрице / фрейме данных? - PullRequest
2 голосов
/ 11 августа 2011

допустим, у меня есть такая матрица:

     [,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

Я ищу простой способ вычесть 3-й столбец из 1-го и 2-го, затем 6-й из 4-го и 5-го и т. Д.

Могу ли я сделать это без цикла for?

Спасибо заранее, zenzen.

Ответы [ 3 ]

3 голосов
/ 12 августа 2011

Этот ответ не красивый. Это действительно должно быть превращено в функцию для ясности, но:

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)]

нет для цикла! И результат:

     [,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

edit: здесь это как функция

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
}
2 голосов
/ 12 августа 2011

Вот один из способов.

Сначала я покажу принцип:

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
0 голосов
/ 12 августа 2011
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]]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...