сумма векторов в матрице по расстоянию от клетки (R) - PullRequest
2 голосов
/ 16 марта 2020

Предположим, у меня есть матрица A размеров n x m. Начальная ячейка (i,j), и константа k, которая удовлетворяет k < n x m.

Мне нужен способ извлечь значения внутри A, чтобы все значения находились в пределах k шагов от начального клетка. шаг - это перемещение столбца или строки. Затем я собираюсь суммировать извлеченные значения по 2 группам, где 1 группа состоит из сумм, полученных из того же столбца в исходной матрице, а другая группа представляет собой сумму, полученную в результате суммирования значений по строкам исходной матрицы.

Для меня важно, чтобы это касалось ситуаций, когда начальная ячейка находится в пределах k шагов от края матрицы. Пример набора (я здесь сильно упрощаю):

> #create matrix where m = 7,n = 7
> Mat <- sample(1:49,49) %>% matrix(7,7)
> 
> #declare starting cell where (i = 4, j = 2)
> i = 4
> j = 2
> 
> #declare number of steps
> k = 2
> 
> Mat
     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]   25   35   29   10   16   46   23
[2,]   32   43    7    5   31    1   14
[3,]   36   19   49   45   13   41   47
[4,]   17   18   48    9    3   28   12
[5,]   26    6   30   33   20    2   11
[6,]   40   24   39   21   37   38    8
[7,]    4   15   34   22   27   44   42
> Mat[i,j]
[1] 18

для этого примера выходными данными будут два вектора (один для сумм столбцов и один для сумм строк):

> Columnsum  <- c(sum(36,17,26) ,           #sum(Mat[3:5,1])
+                 sum(43,19,18,6,24),       #sum(Mat[2:6,2])
+                 sum(49,48,30),            #sum(Mat[3:5,3])
+                 sum(9))                   #sum(Mat[4:4,3])
> 
> Rowsum <- c(sum(43),                       #sum(Mat[2,2:2])
+             sum(36,19,49),                 #sum(Mat[3,1:3])
+             sum(17,18,48,9),               #sum(Mat[4,1:4])
+             sum(26,6,30),                  #sum(Mat[5,1:3])
+             sum(24))                       #sum(Mat[6,2:2])
>             
> Columnsum
[1]  79 110 127   9
> Rowsum
[1]  43 104  92  62  24

1 Ответ

1 голос
/ 16 марта 2020

Вы можете «удалить» части вашей матрицы Mat с записями более чем на k шагах от (i,j), переписав их с помощью NA:

Mat[abs(row(Mat) - i) + abs(col(Mat) - j) > k] <- NA

Затем удалите строки и столбцы, которые полностью NA:

Mat <- Mat[rowSums(is.na(Mat)) != ncol(Mat), colSums(is.na(Mat)) != nrow(Mat)]

И, наконец, вы можете вычислить суммы строк и столбцов:

Columnsum <- colSums(Mat, na.rm = TRUE)
Rowsum <- rowSums(Mat, na.rm = TRUE)
...