如何在purrr::map()中获取传入的输入(列)名称?
在purrr::map()中获取传入的输入名称
嘿,这个问题我之前也碰到过!用purrr::map()的时候,默认不会把输入的名称传递进去,但有几个简单的办法能解决,让你既能拿到计算结果,又能清楚知道每个结果对应的原输入名称。我给你一步步演示下:
先看现有代码和问题
假设你有这样的代码,对数据框的每列做计算,但输出只有结果,没有对应的列名:
library(purrr) library(tibble) # 示例数据框 my_df <- tibble(a = 1:3, b = 4:6, c = 7:9) # 现有map调用:只返回计算结果 current_output <- map(my_df, ~ sum(.x) * 2) current_output #> $a #> [1] 12 #> $b #> [1] 30 #> $c #> [1] 48
你想要的目标输出是把原输入的名称(比如列名a/b/c)和结果放在一起,像这样:
#> # A tibble: 3 × 2 #> input_name result #> <chr> <dbl> #> 1 a 12 #> 2 b 30 #> 3 c 48
方法1:用purrr::imap()(最简洁)
imap()是map2()的语法糖,专门为带名称的输入设计——它会自动把输入的名称传给.y参数,把输入的值传给.x参数。直接用它来生成包含名称的结果,再绑定成数据框就行:
# 用imap实现目标输出 target_output <- imap(my_df, ~ tibble(input_name = .y, result = sum(.x) * 2)) %>% bind_rows() target_output
方法2:用map2()手动配对名称和值
如果你更习惯用基础的map系列函数,也可以手动提取输入的名称,和输入值配对后用map2()处理:
# 提取列名,和列值一起传入map2 target_output <- map2(names(my_df), my_df, ~ tibble(input_name = .x, result = sum(.y) * 2)) %>% bind_rows()
额外说明
这两种方法不仅适用于数据框的列,对命名列表同样有效——只要你的输入是带名称的,names()能提取出名称,imap()就能自动识别。
内容的提问来源于stack exchange,提问作者Rasmus Larsen
相关产品推荐
相关产品推荐

