R语言如何从复杂嵌套列表中提取所有子项的contactId字段值
问题描述
需要从嵌套结构的R列表中,提取所有层级下联系人的contactId字段值,存入新列表。
待处理的测试数据结构:
surveys<-list( list( list(contactId = 2234, age= 24, unsuscribed = FALSE), list(contactId = 6234, age= 23, unsuscribed = FALSE), list(contactId = 8234, age= 21, unsuscribed = FALSE) ), list( list(contactId = 1124, age= 28, unsuscribed = FALSE), list(contactId = 1874, age= 15, unsuscribed = FALSE), list(contactId = 1674, age= 35, unsuscribed = FALSE), list(contactId = 1324, age= 45, unsuscribed = FALSE), list(contactId = 1234, age= 65, unsuscribed = FALSE) ), list( list(contactId = 1334, age= 18, unsuscribed = FALSE), list(contactId = 1224, age= 45, unsuscribed = FALSE) ) )
当前使用的提取代码仅能返回每个一级子列表中第一个联系人的全量数据,无法拿到所有contactId:
sapply(surveys, "[[",1)
错误原因
上述代码的逻辑是遍历surveys的每个一级子元素,固定提取每个子元素索引为1的条目,没有对子列表内的所有联系人做遍历,因此无法拿到全量的contactId。
可用方案
基础R实现
不需要安装额外包,嵌套一层遍历提取字段,再按需打平结果即可:
# 提取所有contactId,返回一维数值向量 all_contact_id <- unlist(sapply(surveys, function(sub_list) { sapply(sub_list, "[[", "contactId") }))
执行后输出结果:
[1] 2234 6234 8234 1124 1874 1674 1324 1234 1334 1224
如果需要保留分组列表结构,去掉外层的unlist()函数即可。
purrr包实现(tidyverse生态)
如果日常使用tidyverse工具链,可以用purrr的映射函数简化写法:
library(purrr) all_contact_id <- map(surveys, ~map_dbl(.x, "contactId")) |> unlist()
内容的提问来源于stack exchange,提问作者Elvin Mitchell Toro
相关产品推荐
相关产品推荐

