如何将子列表向量名称作为命名元素追加至对应向量中
解决方案
使用tidyverse(purrr)实现
用imap()函数可以同时遍历子列表及其名称,正好满足将子列表名称作为campaign_type值的需求:
library(purrr) result_tidy <- test_list %>% map(~ imap(.x, \(campaign, type) append(campaign, list(campaign_type = type))))
说明
- 外层
map()遍历test_list中的每个顶层列表元素 - 内层
imap()遍历每个顶层列表里的子列表(即manual_campaign和google_ads_campaign),campaign代表子列表内容,type代表子列表的名称 append(campaign, list(campaign_type = type))将新元素追加到子列表末尾,必须用list()包裹新元素,避免字符串被拆分为单个字符
使用base R实现
通过嵌套lapply()结合名称遍历,同样可以实现需求:
result_base <- lapply(test_list, function(top_list) { lapply(names(top_list), function(type) { append(top_list[[type]], list(campaign_type = type)) }) %>% setNames(names(top_list)) })
验证结果
以第一个顶层列表的manual_campaign为例,查看处理后的结构:
result_tidy[[1]]$manual_campaign
输出会包含:
campaign_id: NAcampaign_name: '(organic)'- ...
marketing_tactic: NAcampaign_type: "manual_campaign"
即使google_ads_campaign原本是NULL列表,处理后也会追加campaign_type: "google_ads_campaign"元素。
原代码不符合需求的原因
你之前的代码map_depth(2, \(x) append(x, names(x)))中,names(x)获取的是子列表内部元素的名称(比如campaign_id、campaign_name等),而非外层子列表的名称(manual_campaign/google_ads_campaign),因此会把所有内部元素名追加进去,和预期不符。
内容的提问来源于stack exchange,提问作者DeduciveR
相关产品推荐
相关产品推荐

