частичные суммы строк в многомерных массивах

#r #multidimensional-array

#r #многомерный массив

Вопрос:

У меня вопрос о том, как применить R-функции к многомерным массивам.

Например, рассмотрим эту операцию, где я уменьшаю запись на сумму других записей.

 ppl["2012",,,,,1] <- ppl["2012",,,,,1]
- ppl["2012",,,,,2] - ppl["2012",,,,,3] - ppl["2012",,,,,4]
- ppl["2012",,,,,5] - ppl["2012",,,,,6] - ppl["2012",,,,,7]
- ppl["2012",,,,,8]
  

Хотя в этом случае вычитание отдельных значений может быть осуществимо, я бы предпочел векторно-ориентированный подход.

Если бы я был знаком с алгеброй многомерных матриц, я, вероятно, мог бы придумать матрицу, которая выполняет необходимую операцию при применении, но это слишком сложно, учитывая количество задействованных измерений.

sum(ppl["2012",,,,,2:8]) это неправильное решение, поскольку sum() всегда возвращает скаляры.

Я мог бы использовать циклы, которые выполняют необходимые операции, но это противоречит парадигме векторно-ориентированного программирования.

Спасибо за вашу помощь!

Редактировать: И вот решение исходной проблемы, основанное на предложении Андри: ppl[paste(i),land,,,,1] <- ppl[paste(i),land,,,,1] - apply(ppl[paste(i),land,,,,2:8],c(1,2,3),sum)

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

1. Вам нужно использовать apply with sum , чтобы получить то, что вы хотите. Однако, поскольку вы не предоставили пример с данными , я не могу дать вам точный код.

Ответ №1:

ОТРЕДАКТИРОВАНО

Вот пример использования apply и sum для возврата суммы, вычисленной по многомерной таблице:

 mat <- array(1:27, dim=c(3, 3, 3))
  

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

Затем код для этого становится:

 apply(mat, c(1,2), sum)

     [,1] [,2] [,3]
[1,]   30   39   48
[2,]   33   42   51
[3,]   36   45   54
  

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

1. Спасибо за ваш ответ! Действительно, эти две суммы идентичны, но я не хочу вычитать общую сумму. Вместо этого я хочу вычислять для каждого года, каждой страны, каждого состава домохозяйства и т.д. сумма значений в последнем измерении.

2. @Martin Zuba, спасибо за ваш комментарий. Я изменил свой ответ, чтобы отразить это.

3. Да, это то, что мне нужно! Какой-то алгоритм суммирования, который вернет результат с одним измерением меньше, чем у исходного набора. Большое спасибо!