Удобно изменять элементы, расположенные глубоко во вложенных списках - PullRequest
0 голосов
/ 06 февраля 2020

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

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

# create an element to modify deep within a list
predictions <- c(0,1,0,1,0,1,0,1,0,1)
actual <- c(0,0,0,0,1,1,1,1,0,0)

# compare predictions against actual values with a confusion matrix
confusion_matrix <- table(
  factor(predictions, 
         levels = min(predictions) : max(predictions)),
  factor(actual, 
         levels = min(actual) : max(actual)))
confusion_matrix

# create a nested list
my_list <- list(
  first_layer = (
    list(
      second_a = list(
        third = list(confusion_matrix = confusion_matrix)), 
      second_b = list(
        third = list(confusion_matrix = confusion_matrix)), 
      second_c =list(
        third = list(confusion_matrix = confusion_matrix))
)))

str(my_list, max = 4)

# get the individual entries of the confusion matrix and store them in a 
# list on the same level named "Prediction_cases" to calculate Error types later
for (aa in seq_along(my_list)) {
  for (bb in seq_along(my_list[[aa]])) {
    for (cc in seq_along(my_list[[aa]][[bb]])) {
      print(my_list[[aa]][[bb]][[cc]][["confusion_matrix"]])
      my_list[[aa]][[bb]][[cc]][["Prediction_cases"]] <- list(
        True_negative = my_list[[aa]][[bb]][[cc]][["confusion_matrix"]][1,1], 
        False_negative = my_list[[aa]][[bb]][[cc]][["confusion_matrix"]][1,2], 
        False_positive = my_list[[aa]][[bb]][[cc]][["confusion_matrix"]][2,1], 
        True_positive = my_list[[aa]][[bb]][[cc]][["confusion_matrix"]][2,2]
      )
      # it becomes even more fun with dynamic adressing
      print(my_list[[aa]][[bb]][[cc]][["confusion_matrix"]][2,length(my_list[[aa]][[bb]][[cc]][["confusion_matrix"]][,2])])
    }
  }
}

str(my_list, max = 4)

Это прекрасно работает, но вы можете увидеть, как глубже чем больше, тем больше индексов требуется. Есть ли лучший способ сделать это или более краткий способ написать это для

a) определения в пределах для l oop (for (cc in seq_along(my_list[[aa]][[bb]])))

b) внутри тела Л oop?

1 Ответ

0 голосов
/ 06 февраля 2020

Помогает ли это?

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