如何从嵌套列表中提取数据框的指定单列并保留原结构?
解决方案
方法一:使用purrr包的map_depth(指定嵌套深度)
如果明确知道列表的嵌套深度(本例为2层),可以用map_depth直接对最底层元素操作,提取第一列并保留数据框结构:
library(purrr) library(tibble) # 原始数据 d1 <- tibble(X1 = 1:3, X2 = 0) d2 <- tibble(X1 = 4:6, X2 = 0) d3 <- tibble(X1 = 7:9, X2 = 0) L <- list( list(d1, d1, d1), list(d2, d2, d2), list(d3, d3, d3) ) # 提取第一列,维持原嵌套结构 L_new <- map_depth(L, 2, ~ .x[, 1, drop = FALSE])
drop = FALSE用于确保提取后仍是数据框(tibble),而非向量。
方法二:基础R递归函数(适配任意嵌套深度)
如果列表嵌套深度不固定,递归函数可自动遍历所有层级,遇到数据框就提取第一列:
# 定义递归提取函数 extract_first_col <- function(x) { if (is.data.frame(x)) { return(x[, 1, drop = FALSE]) } else if (is.list(x)) { lapply(x, extract_first_col) } else { x } } # 应用函数到原列表 L_new <- extract_first_col(L)
验证结果
查看处理后的列表元素,确认仅保留第一列且结构不变:
> L_new[[1]][[1]] # A tibble: 3 × 1 X1 <int> 1 1 2 2 3 3
内容的提问来源于stack exchange,提问作者bmacwilliams
相关产品推荐
相关产品推荐

