Поиск имени в иерархическом списке (именованная матрица) и размещение выходных данных в массиве или списке (r)

#r #list #search #matrix #hierarchy

#r #Список #Поиск #матрица #иерархия

Вопрос:

У меня есть сложный иерархический набор списков, в которых хранятся несколько матриц. Я хотел бы сохранить все эти матрицы либо в массиве, либо в списке.

Я говорю массив или список, потому что я не уверен, но, по-видимому, сохранение «пути» к матрице в массиве будет быстрее, чем дублирование всех матриц в новый список.

Вот как создать иерархию списков:

 Kings = c('Alfred the Great', 'Edgar the Peaceful', 'Edmund Ironside', 'Harold Godwinson')
DataSets <- c('KingDF', 'KingDFMtx', 'KingMtx')

KingList <- lapply(Kings, function(K) {
  ret <- rep(tibble(setNames(vector("list", length(DataSets)), 
                           DataSets)), 
             length(Kings))
  setNames(ret, 
           paste0(K, " vs ", Kings)) 
})
names(KingList) <- Kings
str(KingList)
 

Таким образом, это даст вам список королей, со списком внутри каждого из этих списков, сравнивающих королей, а внутри них — список различных форматов данных.

Так, например, у меня есть список «путь», который выглядит следующим образом:

 KingsList[['Alfred the Great']][['Alfred the Great vs Edgar the Peaceful']][['KingMtx']]
 

и еще один, который выглядит так:

 KingsList[['Edmund Ironside']][['Edmund Ironside vs Harrold Goodwinson']][['KingMtx']]
 

И мне нужен массив или список, который собирает все матрицы ‘KingsMtx’, с намерением использовать это для создания одной большой унифицированной матрицы, которая включает все данные.

Однако search.list функция возвращает список каждой отдельной точки данных в матрице с именем ‘KingMtx’, возвращая таким образом беспорядок из сотен целых чисел в довольно бесполезном списке.

Ответ №1:

Предполагая, что ваш список выглядит следующим образом:

 KingList <- lapply(Kings, function(K) {
  vs.list <- lapply(paste0(K, " vs ", Kings), function(x){ ds.list <- lapply(DataSets, function(y){matrix(1:6, nrow=2)}); setNames(ds.list, DataSets)})
 setNames(vs.list, paste0(K, " vs ", Kings))
})
names(KingList) <- Kings
str(KingList)
 

Вы можете получить список всех матриц следующим образом:

 unlisted <- unlist(unlist(KingList, recursive = F), recursive = F)
 

Чтобы получить только матрицы KingMtx , выполните:

 KingMtx <- unlisted[grep('\.KingMtx

И чтобы вернуть это обратно в 1 data.frame:

 KingDF <- as.data.frame(do.call(rbind, lapply(names(KingMtx), function(name){
  d <- as.data.frame(KingMtx[[name]])
  n.split <- strsplit(name, '\.')[[1]]
  d$King <- n.split[1]
  d$opponent <- strsplit(n.split[2], ' vs ')[[1]]
  d
})))
 


, names(unlisted), value = T)]
names(KingMtx) <- sub('\.KingMtxИ чтобы вернуть это обратно в 1 data.frame:


, '', names(KingMtx))

И чтобы вернуть это обратно в 1 data.frame: