2017-11-27 4 views
2

Mein Ziel ist es, eine Funktion zu definieren, um eine numerische Variable in eine Faktorvariable mit definierten Stufen zu konvertieren und sie im ursprünglichen Dataset mit der Funktion dplyr function muate zu überschreiben.verschachtelt if_else in dplyr mutate_ verhält sich unerwartet

Im Anschluss an die Antwort auf diese früheren question konnte ich die Variable in der ursprünglichen Datensatzes zu überschreiben, aber jetzt ist die verschachtelte if_else im dplyr mutate_ unerwartet wie im folgenden Beispiel zu verhalten:

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 

Antwort

1

In neueren (> = 0.7) Versionen von dplyr, die _SE-Version von Funktionen wie mutate_ wurde zugunsten einer neuen komplizierten Syntax abgeschrieben.

So könnte Ihre Funktion neu geschrieben werden als:

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) 
    } 

Sie mehr über quosures und andere Komplexitäten here lesen kann. Diese earlier StackOverflow question kann auch hilfreich sein.

Verwandte Themen