R длинный стол в многомерных массивах - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть таблица в длинном формате:

require(data.table)
sampleDT <- data.table(Old = c("A","B","A","B","A","B","A","B")
                       , New = c("A","A","B","B","A","A","B","B")
                       , Time = c(1,1,1,1,2,2,2,2)
                       , value1 = c(1,1,1,1,1,1,1,1)
                       , value2 = c(0,0,0,0,0,0,0,0))
print(sampleDT)

   Old New Time value1 value2
1:   A   A    1      1      0
2:   B   A    1      1      0
3:   A   B    1      1      0
4:   B   B    1      1      0
5:   A   A    2      1      0
6:   B   A    2      1      0
7:   A   B    2      1      0
8:   B   B    2      1      0

Я хотел бы преобразовать в массив из 3 измерений.Что-то вроде: enter image description here

По сути, у нас были бы столбцы «Новое, Старое, Время» в качестве наших трех измерений.И значение для каждой ячейки является выходом некоторого вида функций, чьи входные данные имеют значение «value1, value2».

В этом случае, когда Time = 1, результат будет:

matrix(data = c(1, 1+0, 0, -0), nrow = 2, ncol = 2, byrow = FALSE)
     [,1] [,2]
[1,]    1    0
[2,]    1    0

Как этого добиться?

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

1 Ответ

0 голосов
/ 11 февраля 2019

Попробуйте xtabs ():

sampleDT <- data.frame(Old = c("A","B","A","B","A","B","A","B"), 
                       New = c("A","A","B","B","A","A","B","B"),
                       Time = c(1,1,1,1,2,2,2,2),
                       value1 = c(1,1,1,1,1,1,1,1),
                       value2 = c(0,0,0,0,0,0,0,0))

Value1 <- xtabs(value1 ~ Old + New + Time, sampleDT, drop = FALSE)
Value2 <- xtabs(value2 ~ Old + New + Time, sampleDT, drop = FALSE)

is.array(Value1)
is.array(Value2)

Value1[, 2,] <- 0 # Sets all second columns to zero for Value1
Value2[1,,] <- 0 # Idem with first row for Value2
Value2[2,2,] <- Value2[2,2,] * (-1)

Result <- Value1 + Value2

Result

, , Time = 1

   New
Old A B
  A 1 0
  B 1 0

, , Time = 2

   New
Old A B
  A 1 0
  B 1 0

Надеюсь, это поможет.

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