Поиск в иерархическом списке по имени (именованная матрица) и размещение вывода в массиве или списке (r) - PullRequest
0 голосов
/ 14 апреля 2019

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

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

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

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 Ответ

1 голос
/ 15 апреля 2019

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

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

KingMtx <- unlisted[grep('\\.KingMtx$', names(unlisted), value = T)]
names(KingMtx) <- sub('\\.KingMtx$', '', names(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
})))
...