在分层列表中搜索名称(命名矩阵)并将输出放入数组或列表 (r)

Searching Hierarchical List for a Name (a Named Matrix) and Placing Output in an Array or List (r)

我有一组复杂的分层列表,其中存储了多个矩阵。我想将所有这些矩阵存储在数组或列表中。

我说数组或列表是因为我不确定,但大概将 'path' 存储到数组中的矩阵比将所有矩阵复制到一个新列表中要快。

创建列表层次结构的方法如下:

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)

因此,这将为您提供一个国王列表,每个列表中都有一个比较国王的列表,在这些列表中,还有各种数据格式的列表。

例如,我有一个列表 'path',如下所示:

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

还有一个看起来像这样:

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

我想要一个数组或列表来收集所有 'KingsMtx' 矩阵,目的是使用它来创建一个包含所有数据的大型统一矩阵。

但是 search.list 函数 returns 一个名为 'KingMtx' 的矩阵中每个数据点的列表,因此在一个相当无用的列表中返回了数百个整数的混乱。

假设您的列表如下所示:

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$', 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
})))