【问题标题】:How to pass multiple columns as string to function in dplyr::mutate_at如何将多列作为字符串传递给 dplyr::mutate_at 中的函数
【发布时间】:2017-10-26 12:07:53
【问题描述】:

我有以下(高度简化的)dplyrmutate 的示例:

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") )

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

【问题讨论】:

  • 您要计算行分钟数吗? mutate_at 并不是要进行逐行操作。

标签: r dplyr rlang


【解决方案1】:

mutate_at 分别对每一列进行变异。

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

xx %>% 
   mutate(z = map2(!!sym("x"), !!sym("y"), !!sym("bla_fun")))

【讨论】:

    【解决方案2】:
    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)) 或直接将bla_funpmin() 重写/矢量化为mutate
    将此与对字符串的syms 结合使用:例如mutate(xx, z = mapply(bla_fun, !!! syms)),或mutate(xx, z = purrr::pmap_dbl(list(!!! syms), bla_fun))

    【讨论】:

      猜你喜欢
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      • 2015-03-29
      • 2016-12-13
      • 1970-01-01
      • 2017-09-12
      • 1970-01-01
      相关资源
      最近更新 更多