如何修改createBucket()函数,将Total列表合并到父子结构列表中?
解决R中嵌套列表合并的命名长度不匹配问题
问题说明
现有createBucket()函数可遍历dfVector向量与dfList列表,生成扩展的父子结构嵌套列表。需要修改该函数,将包含baVector和inVector的Total列表合并到结果中,使其与$DF_One、$DF_Two处于同一层级。此前尝试将函数返回值替换为c(total, series),出现“names属性长度与向量不匹配”错误,需找到正确修改方案。
原代码
dfVector <- function() {c("DF_One", "DF_Two")} dfList <- list(DF_One = c("Boy", "Cat"), DF_Two = c("Rat", "Bat")) baVector <- c(1000,1000,1000) inVector <- c(6,5,4) createBucket <- function(nbr_rows) { total <- list( baVector = baVector, inVector = inVector ) series <- dfVector() setNames( lapply(series, \(series_name) { setNames( lapply(dfList[[series_name]], \(element) { df <- as.data.frame(matrix(0, nbr_rows, 2)) colnames(df) <- c('A', 'B') df }), dfList[[series_name]] ) }), series ) } tmp <- createBucket(2) tmp
解决方案
错误原因
直接使用c(total, series)会将total中的两个子元素(baVector、inVector)拆分为顶级元素,和series中的DF_One、DF_Two并列,既不符合“Total作为单独顶级元素”的需求,也容易触发命名长度不匹配的报错。我们需要将total包装成一个名为Total的顶级列表元素,再与原有结构合并。
修改后的代码
dfVector <- function() {c("DF_One", "DF_Two")} dfList <- list(DF_One = c("Boy", "Cat"), DF_Two = c("Rat", "Bat")) baVector <- c(1000,1000,1000) inVector <- c(6,5,4) createBucket <- function(nbr_rows) { total <- list( baVector = baVector, inVector = inVector ) series <- dfVector() # 先保存原有逻辑生成的嵌套列表 series_list <- setNames( lapply(series, \(series_name) { setNames( lapply(dfList[[series_name]], \(element) { df <- as.data.frame(matrix(0, nbr_rows, 2)) colnames(df) <- c('A', 'B') df }), dfList[[series_name]] ) }), series ) # 将total包装为带顶级名称的列表,再与原有列表合并 c(list(Total = total), series_list) } tmp <- createBucket(2) tmp
效果说明
修改后运行代码,输出的tmp结构会将Total与DF_One、DF_Two置于同一层级,符合需求:
$Total $Total$baVector [1] 1000 1000 1000 $Total$inVector [1] 6 5 4 $DF_One $DF_One$Boy A B 1 0 0 2 0 0 $DF_One$Cat A B 1 0 0 2 0 0 $DF_Two $DF_Two$Rat A B 1 0 0 2 0 0 $DF_Two$Bat A B 1 0 0 2 0 0
内容的提问来源于stack exchange,提问作者Curious Jorge - user9788072
相关产品推荐
相关产品推荐

