错误使用R函数使用变量/列名作为参数使用mutate和case_when创建新变量



我在R中遇到的一个困难是在函数中指定变量名。我看过一些例子,有时使用{{argument}}或其他方法让它们工作,但我真的不明白为什么有些事情可以工作,而另一些却不行。例如,我只是试图做一个函数,将使用2个变量值来生成一个新的变量。可复制的示例如下:

look<-cars
twotoone<-function(v1,v2,nv){
look<-look %>% mutate(nv=case_when(
v1 > 4 & v2 > 4 ~ 1,
TRUE ~ 0
))
look<<-look
}
twotoone(speed,dist,allover4)

我得到一个错误:

错误:mutate()nv有问题。inv = case_when(v1 > 4 & v2 > 4 ~ 1, TRUE ~ 0)。X对象'speed'未找到

如果我把所有的参数都放在引号里:

twotoone('speed','dist','allover4')

没有错误,但是输出数据帧有新的变量nv而不是'allover4',并且它总是=1(即使速度或距离中的一个低于4也没有分配0)。如果我只引用前两个参数,也会出现相同的结果:

twotoone('speed','dist',allover4)

任何帮助,帮助我了解如何扩展使用函数,以帮助与代码和复合变量,将不胜感激。谢谢! !

我们可以使用{{}}-花括号运算符,它对传递未引用的参数进行非标准求值-以前是用enquo+!!完成的。一般来说,=不能在lhs上对表达式求值,而tidyverse中的:=可以,这就是我们使用:=

的原因。
twotoone<-function(dat, v1,v2,nv){
dat %>%
mutate({{nv}} := case_when(
{{v1}} > 4 & {{v2}} > 4 ~ 1,
TRUE ~ 0
))
}

测试

twotoone(cars, speed,dist,allover4)
speed dist allover4
1     4    2        0
2     4   10        0
3     7    4        0
4     7   22        1
5     8   16        1
6     9   10        1
...

以下是ensym!!的版本:

twotoone<-function(df, v1,v2,nv){
v1 <- rlang::ensym(v1)
v2 <- rlang::ensym(v2)
nv <- rlang::ensym(nv)

df %>% 
mutate(!!nv := case_when(
!!v1 > 4 & !!v2 > 4 ~ 1,
TRUE ~ 0
))
}
twotoone(cars, speed,dist,allover4)
speed  dist allover4
<dbl> <dbl>    <dbl>
1     4     2        0
2     4    10        0
3     7     4        0
4     7    22        1
5     8    16        1
6     9    10        1
7    10    18        1
8    10    26        1
9    10    34        1
10    11    17        1
# ... with 40 more rows

最新更新