Помещение фреймов данных в сложные иерархические списки в цикле For-Loop (r) - PullRequest
1 голос
/ 12 апреля 2019

Я создал иерархию списка, и теперь я пытаюсь поместить фреймы данных в эти списки, но я не уверен в синтаксисе, который позволяет мне помещать фрейм данных в список.

По сути, я пытаюсь получить следующее:

PlanetList[["Mars"]][["Mars  vs  Venus"]]["PlanetDataFrame"] <- CurrentDataFrame

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

Но в моем цикле for вот так:

PlanetList[[Planets[i]]][[vsList]]["PlanetDataFrame"] <- CurrentDataFrame

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

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

Вот полный цикл for:

for(i in 1:length(Planets)) {
  for(j in 1:length(Planets)) {    

  #here I create the 'X vs Y' (e.g. Mars vs Venus) variable to 
  #direct my newly retrieved data frame into the correct sublist
  #later on
  vsList <- paste0(Planets[i], ' vs ', Planets[j])

  #obviously - file path. All good here. 
  FilePath <- file.path(paste0(SourceDir, '/', Planets[i]))

  #get my data frame full of exciting numbers
  PlanetDataFrame <- read_delim(file.path(paste0(FilePath, "Correlations_file_for_", Planets[i], '_vs_', Planets[j], '_threshold_0.0.txt')), ' ', trim_ws = TRUE, col_names = FALSE)      

#put that data frame in a corresponding list (or not)
PlanetList[[Planets[i]]][[vsList]]["PlanetDataFrame"] <- PlanetDataFrame

}

}

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

number of items to replace is not a multiple of replacement length

Я сделал этот список иерархическим, используя следующую:

Planets = c('Mercury', 'Venus', 'Earth', 'Mars', 'Jupiter', 'Saturn', 'Uranus', 'Neptune')
DataSets <- c('PlanetDataFrame', 'PlanetMatrix', 'PlanetTable')


PlanetList <- lapply(Planets, function(el_PlanetList_outer) {
  ## create a list with |Planets| elements
  ## this we do by creating first an inner list vector(.)
  ## and the repeating it |Planets| times
  ret <- rep(tibble(setNames(vector("list", length(DataSets)), 
                           DataSets)), 
             length(Planets))
  setNames(ret, ## ret has no proper names yet
           paste(el_PlanetList_outer, " vs ", Planets)) 
})
names(PlanetList) <- Planets ## could have been done with setNames as well
str(PlanetList)

Я думал, что указание 'tibble', а не 'list' (6-я строка текста в приведенном выше блоке) позволит мне поместить туда фрейм данных?

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

Так что, в надежде, вся информация, необходимая, чтобы помочь мне, представлена ​​выше, и с риском длятратить еще несколько сотен битов:

Все, чего я пытаюсь добиться, - это получить файл, подобный следующему:

Correlations_file_for_Saturn_vs_Mercury_threshold_0.0.txt

, а затем аккуратно вставить его в правильный список / подсписок:

PlanetList > Saturn > Saturn vs Mercury > PlanetDataFrame 

Сокращенный вид моего файла hieraRCHY показывает первую планету:

Planet List -
             |
             |-- Mercury -
             |            |
             |            |-- Mercury vs Venus - 
             |            |                     |
             |            |                     |--PlanetDataFrame
             |            |                     | 
             |            |                     |--PlanetMatrix
             |            |                     |
             |            |                     |--PlanetTable
             |            |                     |
            ...          ...                   ...
...