如何在R语言中从嵌套列表提取所有子列表的v元素(含numeric(0))
解决R语言嵌套列表提取
v元素的问题 我明白你现在的需求:要从给定的嵌套列表里提取每个子列表的v元素,既要保留所有重复的数值,也不能丢掉那些numeric(0)的项。之前用的两种方法确实都有问题,我来给你拆解一下可行的方案:
先明确原始列表
首先咱们先把你的列表再清晰定义出来,方便后续测试:
l = list( list(v = numeric(0), pos = 10), list(v = numeric(0), pos = 10), list(v = numeric(0), pos = 10), list(v = 1.227, pos = 19), list(v = 1.227, pos = 19), list(v = 15.2, pos = 19) )
可行的提取方法
方法1:基础R的sapply函数
用sapply遍历每个子列表,直接提取v元素,它会自动保留numeric(0)的位置,也不会去重:
# 提取所有v元素,保留原结构 v_elements <- sapply(l, function(x) x[["v"]]) # 查看结果 v_elements
运行后你会得到一个长度为6的列表,前三个元素是numeric(0),后三个是对应的数值,完全符合你的要求。
方法2:用purrr包简化代码
如果你习惯用tidyverse的工具,purrr::map会更简洁,效果和sapply一致:
library(purrr) v_elements <- map(l, ~ .x[["v"]])
为什么之前的方法失效?
咱们来分析一下你遇到的问题:
rapply+unique:rapply是递归遍历所有嵌套元素,所以会把pos的值也提取出来,再加上unique会自动去重,自然得不到你想要的仅保留v且全量的结果;matrix(unlist(l), ncol=2, byrow=TRUE):unlist处理numeric(0)时会直接忽略它,导致总元素数不是预期的12个(每个子列表2个元素),而是9个,自然无法转换成2列的矩阵,所以会报错。
内容的提问来源于stack exchange,提问作者Haribo
相关产品推荐
相关产品推荐

