Как создавать сложные иерархии списков в R

#r #list #dataframe #vector #lapply

#r #Список #фрейм данных #вектор #lapply

Вопрос:

Я получил помощь о том, как создать набор списков внутри списков, однако мне не удалось добавить еще один слой / расширить глубину моих списков. Все, что я хочу, это добавить последний «слой» в каждый список, который гласит: «DataFrame», «DataFrame2» и так далее. В настоящее время у меня есть:

 Layer1 = c('AA', 'BB', 'CC', 'DD')

myList=setNames(as.list(Layer1),Layer1)

myList=lapply(myList, function(x){
  setNames(vector("list",length(Layer1)),paste0(x," vs ",Layer1))
})
  

Который создает myList , содержащий AA , BB , CC и DD , в каждом из этих списков есть дополнительный список, например AA vs BB , AA vs BB и т.д., или в случае BB списков внутри будет прочитан BB vs AA , BB vs BB (далее именуемый ?? vs ?? файлами) и так далее и тому подобное.

Итак, я подумал, что мог бы легко добавить к этому дополнительный уровень, выполнив что-то вроде…

 Layer1 = c('AA', 'BB', 'CC', 'DD')
Layer3 = c('DataFrame', 'DataFrame2', 'Matrix', 'Matrix2')

myList=setNames(as.list(Layer1),Layer1)

myList=lapply(myList, function(x){
  setNames(vector("list",length(Layer1)),paste0(x," vs ",Layer1))

  myList[i]=lapply(myList, function(x){
  setNames(vector("list",length(Layer3)),Layer3)

  })  
})
  

Где я наивно пытался использовать myList[i] (что, я знаю, не сработает, но я не уверен, что все, что я делаю, сработает), чтобы указать, что я хотел бы перейти на уровень ниже и начать добавлять пустые DataFrame и Matrix векторы (в мои ?? vs ?? подсписки), чтобы у меня были «пустые слоты» — так, чтобыговорите — для перемещения моих данных в будущем.

В конечном счете, я бы хотел, чтобы каждая ?? vs ?? папка содержала пробел DataFrame , DataFrame2 , Matrix , Matrix2 .

Ответ №1:

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

Что вы хотите сделать, это:

  • пройдите по всем элементам Layer1 и создайте для каждого элемента список, который, в свою очередь
  • содержит Layer1 много элементов, каждый из которых содержит
  • столько элементов, сколько указано в Layer3

Код

 Layer1 <- c('AA', 'BB', 'CC', 'DD')
Layer3 <- c('DataFrame', 'DataFrame2', 'Matrix', 'Matrix2')

my_list <- lapply(Layer1, function(el_layer1_outer) {
   ## create a list with |Layer1| elements
   ## this we do by creating first an inner list vector(.)
   ## and the repeating it |Layer1| times
   ret <- rep(list(setNames(vector("list", length(Layer3)), 
                            Layer3)), 
              length(Layer1))
   setNames(ret, ## ret has no proper names yet
            paste(el_layer1_outer, "vs.", Layer1)) 
})
names(my_list) <- Layer1 ## could have been done with setNames as well
str(my_list)
  
 List of 4
 $ AA:List of 4
  ..$ AA vs. AA:List of 4
  .. ..$ DataFrame : NULL
  .. ..$ DataFrame2: NULL
  .. ..$ Matrix    : NULL
  .. ..$ Matrix2   : NULL
  ..$ AA vs. BB:List of 4
  .. ..$ DataFrame : NULL
  .. ..$ DataFrame2: NULL
  .. ..$ Matrix    : NULL
  .. ..$ Matrix2   : NULL
  ..$ AA vs. CC:List of 4
  .. ..$ DataFrame : NULL
  .. ..$ DataFrame2: NULL
  .. ..$ Matrix    : NULL
  .. ..$ Matrix2   : NULL
  ..$ AA vs. DD:List of 4
  .. ..$ DataFrame : NULL
  .. ..$ DataFrame2: NULL
  .. ..$ Matrix    : NULL
  .. ..$ Matrix2   : NULL
 $ BB:List of 4
  ..$ BB vs. AA:List of 4
  .. ..$ DataFrame : NULL
  .. ..$ DataFrame2: NULL
  .. ..$ Matrix    : NULL
  .. ..$ Matrix2   : NULL
  ..$ BB vs. BB:List of 4
  .. ..$ DataFrame : NULL
  .. ..$ DataFrame2: NULL
  .. ..$ Matrix    : NULL
  .. ..$ Matrix2   : NULL
  ..$ BB vs. CC:List of 4
  .. ..$ DataFrame : NULL
  .. ..$ DataFrame2: NULL
  .. ..$ Matrix    : NULL
  .. ..$ Matrix2   : NULL
  ..$ BB vs. DD:List of 4
  .. ..$ DataFrame : NULL
  .. ..$ DataFrame2: NULL
  .. ..$ Matrix    : NULL
  .. ..$ Matrix2   : NULL
 $ CC:List of 4
  ..$ CC vs. AA:List of 4
  .. ..$ DataFrame : NULL
  .. ..$ DataFrame2: NULL
  .. ..$ Matrix    : NULL
  .. ..$ Matrix2   : NULL
  ..$ CC vs. BB:List of 4
  .. ..$ DataFrame : NULL
  .. ..$ DataFrame2: NULL
  .. ..$ Matrix    : NULL
  .. ..$ Matrix2   : NULL
  ..$ CC vs. CC:List of 4
  .. ..$ DataFrame : NULL
  .. ..$ DataFrame2: NULL
  .. ..$ Matrix    : NULL
  .. ..$ Matrix2   : NULL
  ..$ CC vs. DD:List of 4
  .. ..$ DataFrame : NULL
  .. ..$ DataFrame2: NULL
  .. ..$ Matrix    : NULL
  .. ..$ Matrix2   : NULL
 $ DD:List of 4
  ..$ DD vs. AA:List of 4
  .. ..$ DataFrame : NULL
  .. ..$ DataFrame2: NULL
  .. ..$ Matrix    : NULL
  .. ..$ Matrix2   : NULL
  ..$ DD vs. BB:List of 4
  .. ..$ DataFrame : NULL
  .. ..$ DataFrame2: NULL
  .. ..$ Matrix    : NULL
  .. ..$ Matrix2   : NULL
  ..$ DD vs. CC:List of 4
  .. ..$ DataFrame : NULL
  .. ..$ DataFrame2: NULL
  .. ..$ Matrix    : NULL
  .. ..$ Matrix2   : NULL
  ..$ DD vs. DD:List of 4
  .. ..$ DataFrame : NULL
  .. ..$ DataFrame2: NULL
  .. ..$ Matrix    : NULL
  .. ..$ Matrix2   : NULL
  

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

1. Спасибо, это действительно полезно, и включение поясняющих комментариев имеет большое значение.