#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: