Ошибка в `*tmp*`[[i]]: для ошибки цикла при создании вложенного списка в R

#r #for-loop

Вопрос:

Я получаю эту ошибку: Error in *tmp*[[i]] : subscript out of bounds

Когда я запускаю код, который повторяется через i и j.

Примеры данных ниже:

 #Make example data
A1 <- rnorm(1:100, mean = 10, sd = 1)
B1 <- rep(c(2, 4, 5, 7), each = 25)
AB1 <- rbind(A1, B1)
colnames(AB1) <-  rep(c("A","b"), each = 50)

A2 <- rnorm(1:100, mean = 50, sd = 1)
B2 <- rep(c(2, 4, 5, 7), each = 25)
AB2 <- rbind(A2, B2)
colnames(AB2) <-  rep(c("A","b"), each = 50)

A3 <- rnorm(1:100, mean = 100, sd = 1)
B3 <- rep(c(2, 4, 5, 7), each = 25)
AB3 <- rbind(A2, B2)
colnames(AB3) <-  rep(c("A","b"), each = 50)

data <- list(AB1, AB2, AB3)

# for loop showing error
histlist = NULL
for (i in seq_along(data)) {
  columns <- unique(colnames(data[[i]]))
  for (j in columns) {
    columnsub <- data[[i]][, c(rep(c("A"), each = 50))]
    histlist[[i]][[j]] <- hist(columnsub) #error from this line
  }
} 
 

Я хочу, чтобы цикл создавался histlist с каждым i в виде вложенного списка, имеющего A вложенные значения и B со вложенными hist() значениями. В основном, то, что вы видите histlist после первой итерации.

Любая помощь будет очень признательна

Ответ №1:

Мы можем исправить проблему, обратившись histlist = NULL к :

 histlist = vector('list', length(data))
 

Это позволит предварительно выделить вектор и правильно назначить его в список.

Комментарии:

1. Именно то, что мне было нужно. Спасибо!

Ответ №2:

Вы можете сделать это с помощью вложенного lapply вызова, который автоматически создаст вложенный список.

 histlist <- lapply(data, function(x) {
  cols <- unique(colnames(x))
  lapply(cols, function(y) hist(x[, colnames(x) == y]))
})