如何为R语言中深度为5的嵌套列表设置名称
深度5嵌套列表命名失败的解决方法
错误根源
你最后一行的map_depth用法完全错误:map_depth(2, ~set_names(.x, .y))中,map_depth的第一个参数必须是要处理的列表对象,你却把公式当成第一个参数传入,R会误将这个公式识别为depth参数(map_depth的第二个参数才是深度值),因此报出“depth必须是整数”的错误。
正确实现代码
要给最内层列表设置名称,需要对应nested_data3和category3_by_category2_by_category1的层级结构——两者都是category1 -> category2 -> 子元素的结构,我们需要对每个category1下的category2组,用对应的名称向量给无名列表命名。用两层map2即可实现:
# 给深度5的列表设置名称 nested_data3_named <- map2(nested_data3, category3_by_category2_by_category1, ~map2(.x, .y, set_names))
如果觉得短格式不够清晰,也可以写成长格式:
nested_data3_named <- map2(nested_data3, category3_by_category2_by_category1, function(data_sub, names_sub) { map2(data_sub, names_sub, function(data_inner, names_inner) { set_names(data_inner, names_inner) }) })
验证命名是否成功
用str函数查看结构,确认最内层名称已正确设置:
str(nested_data3_named, max.level = 5)
输出里能看到最内层的列表元素已经被命名为对应的category3取值(比如j、k、l等)。
更高效的替代思路
其实从原始数据出发,完全可以一步生成所有层级都带名称的嵌套列表,省去逐层手动处理的繁琐步骤:
# 一步生成深度5的命名嵌套列表 nested_data_final <- data %>% group_nest(category1, category2, category3) %>% split(.$category1) %>% map(~split(., .$category2)) %>% map_depth(2, ~split(.$data, .$category3)) %>% map_depth(2, ~map(., pluck, 1))
这个方法生成的结构和你需要的完全一致,还避免了手动提取名称、逐层嵌套的重复操作。
内容的提问来源于stack exchange,提问作者Xavier
相关产品推荐
相关产品推荐

