获取列的名称作为在 mutate_all 整洁管道中运行的附加参数
Getting the name of a column as an additional argument to function in a mutate_all tidy pipe
我想在一个函数中使用一个列的名称,而不是明确地将它作为该函数的参数,以整齐的方式调用(dplyr
、tidyr
、purrr
...) 管道。这是因为我想在许多列上使用此函数(例如 mutate_all
和 map
),而不是单独 mutate
ing 每一列。
示例:
假设我希望每列中的每个值都以该列名称和下划线作为前缀。以下作品:
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)
我想在一个函数中使用一个列的名称,而不是明确地将它作为该函数的参数,以整齐的方式调用(dplyr
、tidyr
、purrr
...) 管道。这是因为我想在许多列上使用此函数(例如 mutate_all
和 map
),而不是单独 mutate
ing 每一列。
示例:
假设我希望每列中的每个值都以该列名称和下划线作为前缀。以下作品:
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)