arrange_() multiple columns with descending order

后端 未结 1 1756
野趣味
野趣味 2020-12-31 09:43

I am trying to use arrange_() with string input and in one of the columns in descending order.

library(dplyr) # R version 3.3.0 (2016-05-03) , d         


        
相关标签:
1条回答
  • 2020-12-31 10:02

    We can paste 'desc' as a string to evaluate it.

    myCol1 <- paste0("desc(", "x)")
    df1 %>% 
         arrange_(.dots = c("grp", myCol1))
    #  grp    x
    #1   1 6.16
    #2   1 3.39
    #3   1 2.82
    #4   2 9.17
    #5   2 4.35
    

    Or with 'myCol'

    df1 %>% 
          arrange_(.dots = c("grp", paste0("desc(", myCol, ")")))
    

    Or use lazyeval

    library(lazyeval)
    df1 %>%
         arrange_(.dots = c("grp", interp(~ desc(n1), n1 = as.name(myCol))))
    #  grp    x
    #1   1 6.16
    #2   1 3.39
    #3   1 2.82
    #4   2 9.17
    #5   2 4.35
    

    By using "desc(myCol)", it is a single string and the value of the 'myCol' is not evaluated.

    Update

    Or another option is parse_expr (from rlang) and evaluate with !!

    df1 %>%
        arrange(grp, !! rlang::parse_expr(myCol1))
    #grp    x
    #1   1 6.16
    #2   1 3.39
    #3   1 2.82
    #4   2 9.17
    #5   2 4.35
    

    Or using the original string in the OP's post. Convert the string to symbol (sym), evaluate (!!) and arrange it in descending (desc) order

    myCol <- "x"
    df1 %>% 
        arrange(grp, desc(!! rlang::sym(myCol)))
    # grp    x
    #1   1 6.16
    #2   1 3.39
    #3   1 2.82
    #4   2 9.17
    #5   2 4.35
    
    
    
    
     
    
    0 讨论(0)
提交回复
热议问题