dplyr中嵌套的if_else会意外地发生变异
我的目标是定义一个函数,将数值变量转换为 因子变量,并使用dplyr函数mutate在原始数据集中覆盖它 根据前面的答案,我成功地覆盖了原始数据集中的变量,但现在dplyr mutate_uu中嵌套的if_else行为异常,如以下示例所示:dplyr中嵌套的if_else会意外地发生变异,r,if-statement,dplyr,mutate,R,If Statement,Dplyr,Mutate,我的目标是定义一个函数,将数值变量转换为 因子变量,并使用dplyr函数mutate在原始数据集中覆盖它 根据前面的答案,我成功地覆盖了原始数据集中的变量,但现在dplyr mutate_uu中嵌套的if_else行为异常,如以下示例所示: library(dplyr) library(lazyeval) set.seed(1234) a<-runif(10,1,13) b<-1:10 data<-data.frame(cbi
library(dplyr)
library(lazyeval)
set.seed(1234)
a<-runif(10,1,13)
b<-1:10
data<-data.frame(cbind(a,b))
data #original data
# a b
# 1 2.364441 1
# 2 8.467593 2
# 3 8.311297 3
# 4 8.480553 4
# 5 11.330985 5
# 6 8.683727 6
# 7 1.113949 7
# 8 3.790606 8
# 9 8.993005 9
# 10 7.171014 10
dataout1 <- mutate(data, a=factor(if_else(a<3,"low",if_else(a>3&a<6,"average","high"))))
dataout1 # what I expect
# a b
# 1 low 1
# 2 high 2
# 3 high 3
# 4 high 4
# 5 high 5
# 6 high 6
# 7 low 7
# 8 average 8
# 9 high 9
# 10 high 10
#my function
my_func<-function(datain,var,colname=eval(deparse(substitute(var)))){
dataout <- datain %>% mutate_(.dots=setNames(list(interp(~factor(if_else(var<3,"low",
if_else(var>3&var<6
,"average",
"high"))),
var=colname)),
colname)
)
}
dataout2<-my_func(data,a)
dataout2
# a b
# 1 high 1
# 2 high 2
# 3 high 3
# 4 high 4
# 5 high 5
# 6 high 6
# 7 high 7
# 8 high 8
# 9 high 9
# 10 high 10
库(dplyr)
图书馆(懒汉)
种子集(1234)
a在较新(>=0.7)版本的dplyr
中,诸如mutate
等函数的使用版本已被弃用,取而代之的是新的复杂的quosure语法
因此,您的函数可以重新编写为:
my_func <- function(data_in, var){
col_name <- quo_name(enquo(var))
data_out <- data_in %>% mutate(!!col_name := ifelse(!!var < 3,
'low',
ifelse(!!var > 6,
'high',
'medium')
)
)
return(data_out)
}
my_func