获取列的名称作为在 mutate_all 整洁管道中运行的附加参数

Getting the name of a column as an additional argument to function in a mutate_all tidy pipe

我想在一个函数中使用一个列的名称,而不是明确地将它作为该函数的参数,以整齐的方式调用(dplyrtidyrpurrr ...) 管道。这是因为我想在许多列上使用此函数(例如 mutate_allmap),而不是单独 mutateing 每一列。

示例:

假设我希望每列中的每个值都以该列名称和下划线作为前缀。以下作品:

library(dplyr)
library(purrr)
library(stringr)

tib <- tibble(a = 1:3, b = 4:6, c = 7:9)

f <- function(value, column_name) {
  str_c(column_name, "_", value)
}

tib %>%
  mutate(a = map_chr(a, f, "a"),
         b = map_chr(b, f, "b"),
         c = map_chr(c, f, "c"))

# A tibble: 3 x 3
  a     b     c
<chr> <chr> <chr>
1   a_1   b_4   c_7
2   a_2   b_5   c_8
3   a_3   b_6   c_9

但是如果我有 n >> 3 列呢?

最好有一个函数自己找出列名,然后我可以使用mutate_all:

f2 <- function(value) {
  column_name <- miraculously_get_column_name()
  str_c(column_name, "_", value)
}

tib %>%
  mutate_all(f2)

但这不会发生。一个可能更现实的愿望是输入一个表达式作为 mutate_all 的附加参数,该表达式查找每列的列名并使用原始 f,例如:

tib %>%
  mutate_all(f, get_column_name_somehow())

那么我该如何用管道来做到这一点(如果有另一种方法,但没有办法用干净的管道来做到这一点,那就让我们来吧)。

你可以这样做:

tib %>% map2_df(names(.),f)

或者正如@aosmith 在评论中提到的那样,您可以使用 imap_dfc 这是您问题的准确答案:

tib %>% imap_dfc(f)