У меня есть 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)))