Конвертировать 3D массив в список данных - PullRequest
0 голосов
/ 26 октября 2019

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

Например,рассмотрим следующий трехмерный массив

> (src <- array(1:8, c(2, 2, 2), dimnames=list(c('X1', 'X2'), c('Y1', 'Y2'), 1:2)))
, , 1

   Y1 Y2
X1  1  3
X2  2  4

, , 2

   Y1 Y2
X1  5  7
X2  6  8

Я хотел бы преобразовать его в

> (dest <- list(Y1=data.frame(X1=c(1, 5), X2=c(2, 6), Y1=c(1, 5)+c(2, 6)),
                Y2=data.frame(X1=c(3, 7), X2=c(4, 8), Y2=c(3, 7)+c(4, 8))))
$Y1
  X1 X2 Y1
1  1  2  3
2  5  6 11

$Y2
  X1 X2 Y2
1  3  4  7
2  7  8 15

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

> library(dplyr)
> as.data.frame(t(src[, 'Y1', ])) %>% mutate(Y1=X1+X2)
  X1 X2 Y1
1  1  2  3
2  5  6 11

Не стесняйтесь использовать base R, dplyr, data.table или любой другой пакет, который вы предпочитаете, если он достаточно быстрый. В реальном приложении dim(src) имеет тенденцию быть чем-то вроде c(hundreds, tens, tens of thousands).

1 Ответ

2 голосов
/ 26 октября 2019

Мы могли бы сначала apply data.frame -преобразовать на полях 2 транспонированного массива, где мы транспонируем массивы с aperm(). Затем мы поступим аналогично с colSums. Чтобы получить правильные имена "Y1", "Y2", мы делаем промежуточный шаг, перечисляя столбцы в виде фреймов данных. Наконец, Map оценивает оба списка (X* и столбцы Y*) элемент за элементом.

dest <- Map(cbind, apply(aperm(src, c(3, 2, 1)), 2, data.frame), 
    {tmp <- data.frame(apply(src, 2, colSums));list(tmp[1], tmp[2])})
dest
# $Y1
#   X1 X2 Y1
# 1  1  2  3
# 2  5  6 11
# 
# $Y2
#   X1 X2 Y2
# 1  3  4  7
# 2  7  8 15
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...