R tidyverse如何对列表列执行left_join且无需提前执行unnest?
解决方案
1. 无需unnest的列表列匹配方案
直接对提取出的project_id列表列用purrr::map遍历匹配即可,全程不需要展开嵌套结构,比先unnest再join再nest的方案性能更好,也更简洁:
library(tidyverse) modified_data <- initial_data %>% # 原有提取项目ID逻辑不变 mutate(project_id = str_extract_all(billing_comment, "003.."), # 直接遍历每个行的ID列表匹配数据库 project_data = map(project_id, function(ids) { match_res <- filter(project_id_database, project_id %in% ids) # 无匹配时返回NA,和你预期的输出结构一致 if(nrow(match_res) == 0) NA else match_res }))
如果不需要无匹配时返回NA,保留0行tibble的话还可以进一步简化成一行:
modified_data <- initial_data %>% mutate(project_id = str_extract_all(billing_comment, "003.."), project_data = map(project_id, ~ filter(project_id_database, project_id %in% .x)))
2. 取第一个匹配项的代码优化
你原来的代码有两处可优化:一是不需要拆分两次mutate,二是可以用更安全的取值函数避免空匹配时报错,优化后代码如下:
test_data_nest %>% mutate(final_project = map(data, ~ filter(.x, status == "Match") %>% pluck(1, .default = NA)))
如果只需要返回项目ID的字符值,不需要保留列表结构,还可以直接返回原子向量:
test_data_nest %>% mutate(final_project = map_chr(data, ~ filter(.x, status == "Match") %>% pull(project_id) %>% first(default = NA_character_)))
内容的提问来源于stack exchange,提问作者Sarkans Satans
相关产品推荐
相关产品推荐

