在分层列表中搜索名称(命名矩阵)并将输出放入数组或列表 (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
})))
我有一组复杂的分层列表,其中存储了多个矩阵。我想将所有这些矩阵存储在数组或列表中。
我说数组或列表是因为我不确定,但大概将 '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
})))