如何将多列作为字符串传递给 dplyr::mutate_at 中的函数
How to pass multiple columns as string to function in dplyr::mutate_at
我有以下(高度简化的)dplyr
mutate
示例:
xx <- data.frame(x = 1:10, y = c(rep(1,4),rep(2,6)))
bla_fun <- function(x,y){cat(x," ",y,"\n"); min(x,y)}
xx %>% rowwise() %>%
mutate( z = bla_fun(x,y))
我想让它与 mutate_at
一起使用,这样可以将列名作为字符串传递给我。
xx %>% rowwise() %>%
mutate_at( c("x","y"), funs("bla_fun") )
但这不起作用。如何让它工作?
syms <- rlang::syms(c("x", "y"))
xx %>%
rowwise() %>%
mutate( z = bla_fun(!!! syms))
旁注 1:mutate_at
通常用于将 n 个一元函数应用于 n 个变量,而不是将 1 个 n 元函数应用于 n 个变量。 mutate
完成任务。
旁注 2:无需按行分组。您可以更简单地将 mutate(xx, z = purrr::map2_dbl(x, y, bla_fun))
或 rewrite/vectorize bla_fun
与 pmin()
直接 mutate
。
将此与对字符串的 syms
结合使用:例如 mutate(xx, z = mapply(bla_fun, !!! syms))
或 mutate(xx, z = purrr::pmap_dbl(list(!!! syms), bla_fun))
.
mutate_at
分别对每一列进行变异。
您的特定示例可以这样解决(假设 min
是一个占位符,不能被 pmin
替换):
xx %>%
mutate(z = map2(!!sym("x"), !!sym("y"), !!sym("bla_fun")))
我有以下(高度简化的)dplyr
mutate
示例:
xx <- data.frame(x = 1:10, y = c(rep(1,4),rep(2,6)))
bla_fun <- function(x,y){cat(x," ",y,"\n"); min(x,y)}
xx %>% rowwise() %>%
mutate( z = bla_fun(x,y))
我想让它与 mutate_at
一起使用,这样可以将列名作为字符串传递给我。
xx %>% rowwise() %>%
mutate_at( c("x","y"), funs("bla_fun") )
但这不起作用。如何让它工作?
syms <- rlang::syms(c("x", "y"))
xx %>%
rowwise() %>%
mutate( z = bla_fun(!!! syms))
旁注 1:mutate_at
通常用于将 n 个一元函数应用于 n 个变量,而不是将 1 个 n 元函数应用于 n 个变量。 mutate
完成任务。
旁注 2:无需按行分组。您可以更简单地将 mutate(xx, z = purrr::map2_dbl(x, y, bla_fun))
或 rewrite/vectorize bla_fun
与 pmin()
直接 mutate
。
将此与对字符串的 syms
结合使用:例如 mutate(xx, z = mapply(bla_fun, !!! syms))
或 mutate(xx, z = purrr::pmap_dbl(list(!!! syms), bla_fun))
.
mutate_at
分别对每一列进行变异。
您的特定示例可以这样解决(假设 min
是一个占位符,不能被 pmin
替换):
xx %>%
mutate(z = map2(!!sym("x"), !!sym("y"), !!sym("bla_fun")))