Я нахожусь в процессе машинного обучения, которое часто включает в себя итерацию по нескольким переменным, чтобы найти лучшие гиперпараметры модели. Поэтому моя информация о том, как модель выполнена для определенной комбинации настроек, находится в списках списков списков.
Теперь предположим, что я хочу получить некоторую информацию и использовать ее для вычисления новых значений на этом уровне в списке.
# 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?