#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
withsum
, чтобы получить то, что вы хотите. Однако, поскольку вы не предоставили пример с данными , я не могу дать вам точный код.
Ответ №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. Да, это то, что мне нужно! Какой-то алгоритм суммирования, который вернет результат с одним измерением меньше, чем у исходного набора. Большое спасибо!