如何为列表内的data.frame添加存储其结构信息的新列
解决方案
你可以用以下两种常见方案实现需求,分别对应Base R和tidyverse生态:
方案1:Base R 实现
用seq_along遍历列表索引,而非直接遍历列表元素,就能直接拿到你定义的「元素描述符」:
out_new <- lapply(seq_along(out), function(i) { # i就是当前元素的索引,即元素描述符 out[[i]]$Chr <- i return(out[[i]]) })
你不需要额外调用rapply计算行数,R会自动把长度为1的i循环补齐到和data.frame行数一致,不用手动写rep逻辑。
如果你习惯用Map写法,也可以写成:
out_new <- Map(function(df, idx) {df$Chr <- idx; return(df)}, out, seq_along(out))
方案2:tidyverse(purrr)实现
如果已经加载purrr包,用imap会更简洁,imap会自动把列表的索引作为第二个参数传入匿名函数:
library(purrr) out_new <- imap(out, ~{.x$Chr <- .y; return(.x)})
如果需要Chr列是字符型,把.y替换为as.character(.y)即可。
内容的提问来源于stack exchange,提问作者PolII
相关产品推荐
相关产品推荐

