R语言嵌套列表操作:为最内层元素新增grp标识变量
R嵌套列表批量添加grp字段实现方案
方案1:purrr包实现(推荐)
purrr::imap自带遍历元素+对应索引/名称的能力,完美匹配你要的类似bind_rows(.id)的逻辑:
# 加载包 library(purrr) # 原始嵌套列表 ll <- list( a = list(data.frame(c = 1, d = 2), data.frame(h = 3, j = 4)), b = list(data.frame(c = 5, d = 6), data.frame(h = 7, j = 9)) ) # 批量添加grp字段 ls_result <- map(ll, ~ imap(.x, \(df, idx) { df$grp <- idx df }))
逻辑说明:
- 外层
map遍历一级列表的每个子列表(即示例中a、b对应的二级列表) - 内层
imap遍历二级列表的每个数据框,自动取元素的名称(如果二级列表有命名)或整数索引(无命名)作为idx,赋值给新增的grp字段 - 全程不做行合并,输出结构和原嵌套列表完全一致
方案2:纯Base R实现
不需要加载额外依赖包的写法:
ls_result <- lapply(ll, function(sublist) { # 优先取二级列表的名称,无名称则取索引 idx_vals <- if (is.null(names(sublist))) seq_along(sublist) else names(sublist) mapply(\(df, idx) { df$grp <- idx df }, df = sublist, idx = idx_vals, SIMPLIFY = FALSE) })
两种方案输出的结果都和你给出的示例完全一致:
> ls_result$a[[1]] c d grp 1 1 2 1 > ls_result$b[[2]] h j grp 1 7 9 2
内容的提问来源于stack exchange,提问作者vog
相关产品推荐
相关产品推荐

