Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
dplyr中嵌套的if_else会意外地发生变异_R_If Statement_Dplyr_Mutate - Fatal编程技术网

dplyr中嵌套的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

我的目标是定义一个函数,将数值变量转换为 因子变量,并使用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(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