dplyr函数中的mutate_each有效但match()找不到参数

时间:2015-03-11 13:33:31

标签: r dplyr

尝试解决this problem时,mutate_each dplyr遇到了问题。我想在函数中使用它并将参数传递给它。 funs()成功,但matches()成功。

让我举一个简单的例子,其中任务是在某些变量的值附加一些标记。

library(dplyr) 
mydf <- data.frame(this_var1 = c("a", "b", "c", "d", "e"), 
                   this_var2 = c("b", "c", "d", "e", "f"),
                   that_var1 = c("x", "y", "z", "w", "u"))

mymutate1 <- function(data, tag) {
  data %>% mutate_each(funs(paste0(., tag)))
}

mymutate1(mydf, "_foo")
  this_var1 this_var2 that_var1
1     a_foo     b_foo     x_foo
2     b_foo     c_foo     y_foo
3     c_foo     d_foo     z_foo
4     d_foo     e_foo     w_foo
5     e_foo     f_foo     u_foo    

这就像一个魅力。但是,如果我试图控制应该应用转换的变量,它也会失败。

mymutate2 <- function(data, tag, m) {
  data %>% mutate_each(funs(paste0(., tag)), matches(m))
}
mymutate2(mydf, "_foo", "this")

这会出现以下错误:Error in is.string(match) : object 'm' not found。为什么tag找不到m而不是mydf %>% mutate_each(funs(paste0(., "_foo")), matches("this")) this_var1 this_var2 that_var1 1 a_foo b_foo x 2 b_foo c_foo y 3 c_foo d_foo z 4 d_foo e_foo w 5 e_foo f_foo u

代码本身按预期工作:

{{1}}

1 个答案:

答案 0 :(得分:6)

您将要使用mutate_each的{​​{3}}版本 - 即mutate_each_

mymutate2 <- function(data, tag, m) {
  data %>% mutate_each_(funs(paste0(., tag)), ~matches(m))
}

为了更加清晰,以下内容是等效的:

mymutate3 <- function(data, tag, m) {
  data %>% mutate_each_(~paste0(., tag), ~matches(m))
}

根据Standard Evaluation (SE)

“最好使用公式[~而不是quote()或使用字符串""],因为公式会捕获要评估的表达式和环境它应该被评估...使用除公式之外的任何东西都将失败,因为它不知道要查看哪个环境。“