dplyr v.0.6.0标准评估变异

时间:2017-05-23 07:24:03

标签: r dplyr

我试图在dplyr v.0.6.0中找出标准评估的新实现。我已经完成了整个插图,但是在构建要在mutate中进行评估的表达式时,我仍然在努力。

假设我想为x等于var的每一行创建一个为value添加虚拟的函数。它应该同时适用于NA值和常规值。

library(dplyr)
make_dummy_at_value <- function(x, var, value) {
  var_e <- enquo(var)
  value_e <- enquo(value)
  if (is.na(value)) {
    x <- x %>% mutate(dum = as.numeric(is.na(!!var_e)))
  } else {
    x <- x %>% mutate(dum = as.numeric(!!var_e == !!value_e))
  }
  return(x)
}

现在以下工作正常

x <- data.frame(some_var = c(NA, 2))
make_dummy_at_value(x, some_var, NA)

然而,这不是

make_dummy_at_value(x, some_var, 2)

我想我们只能在mutate语句中放置一个不带引号的表达式,但是如何实现呢?

干杯

1 个答案:

答案 0 :(得分:1)

value不需要任何enquo,因为它是数字元素而不是带引号的字符串。此外,它不是一个列。它可以直接在mutate/summarise

中使用
 make_dummy_at_value <- function(x, var, value) {
  var_e <- enquo(var)

  if (is.na(value)) {
    x %>% 
       mutate(dum = as.numeric(is.na(!!var_e)))
  } else {
     x %>% 
        mutate(dum = as.numeric((!!var_e) == value & !is.na(!!var_e) ))
  }

}



make_dummy_at_value(x, some_var, 2)
#  some_var dum
#1       NA   0
#2        2   1
make_dummy_at_value(x, some_var, NA)
#  some_var dum
#1       NA   1
#2        2   0

make_dummy_at_value(x, some_var, 3)
#  some_var dum
#1       NA   0
#2        2   0

如果打算为'value'传递数字和字符串,那么

make_dummy_at_value <- function(x, var, value) {
  var_e <- enquo(var)
   value <- enquo(value)
   value_e <- quo_name(value)

  if (is.na(value_e)) {
    x %>% 
       mutate(dum = as.numeric(is.na(!!var_e)))
  } else {
     x %>% 
        mutate(dum = as.numeric((!!var_e) == value_e & !is.na(!!var_e) ))
  }

}

make_dummy_at_value(x, some_var, 2)
#  some_var dum
#1       NA   0
#2        2   1
make_dummy_at_value(x, some_var, NA)
#  some_var dum
#1       NA   1
#2        2   0
make_dummy_at_value(x, some_var, v1)
#  some_var dum
#1       NA   0
#2        2   0

使用另一个例子

x1 <- data.frame(col1 = c(NA, 4, 5), col2 = c('A', NA, 'B'), stringsAsFactors= FALSE)
make_dummy_at_value(x1, col1, NA)
#  col1 col2 dum
#1   NA    A   1
#2    4 <NA>   0
#3    5    B   0
make_dummy_at_value(x1, col2, NA)
#  col1 col2 dum
#1   NA    A   0
#2    4 <NA>   1
#3    5    B   0
make_dummy_at_value(x1, col2, A)
#  col1 col2 dum
#1   NA    A   1
#2    4 <NA>   0
#3    5    B   0