如何使用map函数对列表子集化并提取所有name元素?
提取嵌套列表中所有
name元素的map实现方案 这问题我熟!你的嵌套列表是三层结构,要提取所有name字段,关键是要先定位到包含两个子列表的那一层,再逐个提取name。下面给你具体的实现方法:
首先先把你的列表赋值给变量,方便后续操作:
# 定义原始嵌套列表 my_list <- list(list(list(name = 'John'), list(name=c("Jack", "Kate"))))
方法1:先定位内层列表,再用map提取name
用pluck()先拿到最外层的第一个元素(也就是包含两个子列表的那一层),然后用map()遍历每个子列表提取name字段:
library(purrr) result <- my_list %>% pluck(1) %>% # 取出最外层的第一个元素,得到 list(list(name='John'), list(name=c("Jack","Kate"))) map("name") # 遍历每个子列表,提取其中的name字段 # 查看结果 result
运行后会得到你想要的输出:
[[1]] [1] "John" [[2]] [1] "Jack" "Kate"
方法2:直接遍历内层元素的索引路径
如果你不想用pluck(),也可以直接指定遍历的层级,用匿名函数或字符串索引实现:
# 匿名函数写法 result <- map(my_list[[1]], ~ .x$name) # 更简洁的字符串索引写法 result <- map(my_list[[1]], "name")
两种写法的效果完全一致。
为什么你之前的写法只拿到第一个name?
你之前用map(list(1, 'name')),是对原始列表的每个元素(原始列表只有1个元素)执行[[1]]$name操作,所以只提取了第一个子列表的name。而我们需要的是遍历内层的两个子列表,所以得先进入到my_list[[1]]这一层再做map。
另外你提到的flatten()也能实现,本质是把最外层的嵌套去掉,和pluck(1)效果类似:
result <- my_list %>% flatten() %>% # 扁平化后得到和my_list[[1]]一样的结构 map("name")
内容的提问来源于stack exchange,提问作者Dambo
相关产品推荐
相关产品推荐

