Массив: вычитание по строке

#r

#r

Вопрос:

Как я могу вычесть вектор из каждой строки в массиве?

 a <- array(1:8, dim=c(2,2,2))
a
, , 1

      [,1] [,2]
[1,]    1    3
[2,]    2    4

, , 2

       [,1] [,2]
[1,]    5    7
[2,]    6    8
  

Использование apply дает мне:

 apply(a,c(1,2), '-',c(1,5))
, , 1

      [,1] [,2]
[1,]    0    1
[2,]    0    1

, , 2

      [,1] [,2]
[1,]    2    3
[2,]    2    3
  

То, что я пытаюсь получить, это:

 , , 1

      [,1] [,2]
[1,]    0   -2
[2,]    1   -1

, , 2

      [,1] [,2]
[1,]    4    2
[2,]    5    3
  

Заранее спасибо за любые подсказки

Ответ №1:

Используется sweep для работы с определенным полем массива: строки являются вторым измерением (margin).

 sweep(a,MARGIN=2,c(1,5),FUN="-")
  

Ответ №2:

 > library (plyr)
> aaply(a, 1, "-", c(1,5) )
, ,  = 1


X1  1  2
  1 0 -2
  2 1 -1

, ,  = 2


X1  1 2
  1 4 2
  2 5 3
  

Комментарии:

1. спасибо и за это решение, оно делает именно то, что я ищу

Ответ №3:

Используйте scale , чтобы вычесть либо среднее значение, либо указанный вектор из каждой строки, а затем разделить его либо на стандартное отклонение, либо на указанный вектор.

Для вашего примера: scale(a, c(1,5), FALSE)

Ответ №4:

 > a - rep(c(1,5),each=2)
, , 1

     [,1] [,2]
[1,]    0   -2
[2,]    1   -1

, , 2

     [,1] [,2]
[1,]    4    2
[2,]    5    3
  

Комментарии:

1. спасибо за ваш ответ, нет ли способа просмотреть массив по строке?