Конвертировать R-массив данных в трехмерный массив - PullRequest
0 голосов
/ 19 июня 2019

У меня есть R dataframe, который имеет N строк и 6 столбцов. В качестве примера я буду использовать следующие имена столбцов: «theDate», «theIndex», «Component_1», «Component_2», «Component_3», «Component_4»

Я пытаюсь преобразовать его в 3-мерный массив с первым измерением, соответствующим «theDate», вторым измерением с «theIndex» и третьим измерением со значениями компонентов.

В качестве примера, выражение NewArray [2,4,3] будет отображать 2-й элемент из столбца «theDate», 4-й элемент из столбца «theIndex» и значение Component_3, которое находится на том же самом строка в качестве 2-го значения из столбца "theDate" и 4-го значения из столбца "theIndex".

Я изучил использование abind, narray и комбинации apply / split / abind без полного успеха.

Самый близкий вопрос, который я нашел на SO, это: Ссылка SO , но я не смог обобщить его в том же ключе, что и ответ, найденный там.

Нужный многомерный массив имеет размеры (5, 7, 4). Первые два измерения соответствуют 5 отдельным элементам в столбце «theDate» и 7 различным элементам в столбце «theIndex», а третье измерение соответствует 4 дополнительным столбцам в кадре данных: Component_1, ..., Component_4)

Вот небольшой фрагмент кода для создания фрейма данных и создания пустого многомерного массива нужных измерений

РЕДАКТИРОВАТЬ: Я также добавил кусок кода, который, кажется, работает, и я был бы заинтересован в других решениях

  `%>%` <- dplyr::`%>%`

  base::set.seed(seed = 1785)

  setOfComponents <-c("Component_1","Component_2","Component_3","Component_4")

  setOfDates <- c(234, 342, 456, 678, 874)
  setOfIndices <- c(2, 7, 11, 15, 24, 36, 56)

  numIndices <- length(setOfIndices)
  numDates <- length(setOfDates)
  numElementsComponent <- numIndices * numDates

  theDF <- base::data.frame(
    theDate = c(base::rep(x = setOfDates[1],times = numIndices),
                base::rep(x = setOfDates[2],times = numIndices),
                base::rep(x = setOfDates[3],times = numIndices),
                base::rep(x = setOfDates[4],times = numIndices),
                base::rep(x = setOfDates[5],times = numIndices)),
    theIndex = base::rep(x = setOfIndices,times = numDates),
    Component_1 = stats::runif(n = numElementsComponent, min = 0, max = 100),
    Component_2 = stats::runif(n = numElementsComponent, min = 0, max = 100),
    Component_3 = stats::runif(n = numElementsComponent, min = 0, max = 100),
    Component_4 = stats::runif(n = numElementsComponent, min = 0, max = 100) )

   theNewDF <- theDF %>%
       tidyr::gather(key = "IdxComp", value = "ValueComp", Component_1, Component_2, Component_3, Component_4)

   newArray <- array(theNewDF$ValueComp, dim = c(length(unique(theDF$theDate)),length(unique(theDF$theIndex)),length(setOfComponents)))

1 Ответ

0 голосов
/ 20 июня 2019

Ознакомьтесь с пакетом тидир.Я думаю, что вам нужна функция gather.

См. Пакет или описания здесь: http://www.cookbook -r.com / Manipulation_data / Converting_data_between_wide_and_long_format /

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