如何设置map2_df输出的列名为函数名与国家名的组合?
问题分析
你当前的map2_df用法是并行迭代.x和.y的对应元素(即第一个国家对应第一个函数、第二个国家对应第二个函数),而非将所有函数应用到所有国家,所以无法生成函数名_国家名的组合列名。此外,.names参数在此场景下不生效,因为它仅用于命名迭代生成的列,而非跨组合的列名拼接。
解决方案
要实现每个函数对应所有国家的列名组合,你需要遍历所有函数-国家的配对,并将结果整理为宽格式。以下是两种简洁的实现方式:
方法1:使用imap_dfc + 函数列表
利用imap_dfc遍历带名称的国家数据列表,对每个国家应用所有函数后,直接拼接函数名与国家名作为列名:
library(purrr) library(dplyr) # 定义命名的函数列表 funcs <- list( stat1 = calculate_stats_1, stat2 = calculate_stats_2, stat3 = calculate_stats_3, stat4 = calculate_stats_4, stat5 = calculate_stats_5 ) # 生成目标结果 result <- imap_dfc(country_data, function(df, country_name) { # 对当前国家应用所有函数,并重命名结果为「函数名_国家名」 map_dbl(funcs, ~ .x(df)) %>% set_names(paste0(names(funcs), "_", country_name)) }) print(result)
方法2:交叉组合 + 宽格式转换
通过生成所有函数-国家的配对,计算结果后再转换为宽格式,适合需要保留中间过程的场景:
library(purrr) library(dplyr) library(tidyr) # 生成国家数据与名称的 tibble country_tbl <- tibble( country = names(country_data), data = country_data ) # 生成函数与名称的 tibble func_tbl <- tibble( func_name = c("stat1", "stat2", "stat3", "stat4", "stat5"), func = list(calculate_stats_1, calculate_stats_2, calculate_stats_3, calculate_stats_4, calculate_stats_5) ) # 生成所有函数-国家组合,计算结果并转换为宽格式 result <- cross_df(list(country = country_tbl$country, func_name = func_tbl$func_name)) %>% left_join(country_tbl, by = "country") %>% left_join(func_tbl, by = "func_name") %>% mutate(value = map2_dbl(data, func, ~ .y(.x))) %>% select(-data, -func) %>% pivot_wider( names_from = c(func_name, country), values_from = value, names_sep = "_" ) print(result)
两种方法最终都会生成符合你需求的列名,例如stat1_USA、stat2_Canada等。
内容的提问来源于stack exchange,提问作者JohnBones JohnBones
相关产品推荐
相关产品推荐

