如何在R语言嵌套列表中筛选非顶层指定元素?
在R嵌套列表中筛选非顶层指定元素的解决方法
你的需求是保留嵌套列表中每个子列表的"A"和"B"元素、排除"C",之前的写法错误是因为多余的第二层遍历导致R误将操作识别为筛选数据框列,以下是正确实现:
正确代码
Base R 实现
NotC <- lapply(MyList, \(x) x[c("A", "B")])
purrr 包实现
library(purrr) NotC <- map(MyList, \(x) x[c("A", "B")])
错误原因解析
你之前的写法在第二层嵌套了map/lapply,这会遍历子列表里的每个元素(A、B、C对应的对象),然后对每个对象执行y[c("A", "B")]:
- 对于空data.frame来说,这是在尝试筛选不存在的"A""B"列,触发
undefined columns selected错误; - 对于
hist()返回的直方图对象,这种索引操作本身也不符合逻辑。
实际上我们不需要遍历子列表的内部元素,直接对每个顶层的子列表(比如MyList[["pine"]])执行元素提取操作即可,也就是直接取x[c("A", "B")],无需额外嵌套遍历。
验证结果可以用str(NotC)查看,每个顶层元素下只会保留A、B两个空data.frame,C元素已被排除。
内容的提问来源于stack exchange,提问作者shirewoman2
相关产品推荐
相关产品推荐

