1

我有以下(高度简化)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") )

但这不起作用。如何让它工作?

4

2 回答 2

1

mutate_at分别改变每一列。

您的特定示例可以像这样解决(假设min是一个不能被替换的占位符pmin):

xx %>% 
   mutate(z = map2(!!sym("x"), !!sym("y"), !!sym("bla_fun")))
于 2017-10-26T12:47:04.250 回答
0
syms <- rlang::syms(c("x", "y"))
xx %>% 
  rowwise() %>%
  mutate( z = bla_fun(!!! syms))

旁注1:mutate_at通常用于将n个一元函数应用于n个变量,而不是将1个n元函数应用于n个变量。mutate做这项工作。

旁注2:无需按行分组。您可以更简单地或直接用tomutate(xx, z = purrr::map2_dbl(x, y, bla_fun))重写/矢量化。 将此与for 字符串的使用结合起来:例如,或.bla_funpmin()mutate
symsmutate(xx, z = mapply(bla_fun, !!! syms))mutate(xx, z = purrr::pmap_dbl(list(!!! syms), bla_fun))

于 2017-10-26T12:46:52.240 回答