2017-05-26 47 views
0

中結合標準和非標準評估我試圖在非標準和標準評估應結合的dplyr中執行任務,但找不到方便的解決方案。我想基於data.frame(需要可視化)的另一列以重新排序級別:在dplyr

df <- data.frame(A = c(1,2,5,4), B = c("A", "B", "C","D")) 
levels(df$B) 
df2 <- df %>% mutate(B = factor(B, levels = unique(B)[order(A, decreasing = FALSE)])) 
levels(df$B) 

到目前爲止,一切都很好。但現在我想要做的完全一樣的任務,但B是一個函數的輸入:

ReorderFactor <- function(column_name){ 
    df2 <- df %>% mutate(column_name = factor(column_name, levels = unique(column_name)[order(A, decreasing = FALSE)])) 
    return(df2) 
} 
ReorderFactor(column_name = "B") 

所以我想標準和非標準的評價結合起來。我正在尋找一種dplyr方法。

回答

2

您可以使用mutate_at,然後參考變量被突變爲.

ReorderFactor <- function(column_name){ 
    df2 <- df %>% 
    mutate_at(column_name, funs(factor(., levels = unique(.)[order(A, decreasing = FALSE)]))) 
    return(df2) 
} 
2

我們可以從dplyr的開發人員版本使用quosure(即將發佈0.6.0

ReorderFactor <- function(dat, column_name){ 
      column_name <- enquo(column_name) 
      nm1 <- quo_name(column_name) 
      dat %>% 
       mutate(UQ(nm1) := factor(UQ(column_name), 
        levels = unique(UQ(column_name))[order(A, decreasing = FALSE)])) 

} 

dfN <- ReorderFactor(df, B) 
identical(df2, dfN) 
#[1] TRUE 

這裏,enquo需要輸入參數,並將其轉換到由內mutate/summarise等評估了quosure不加引號(UQ)。需要注意的是,我們能夠通過unquoting字符串(「NM1」)

注意分配(:=)在上lhs值:在這裏,我們列入「逸」作爲的情況下,該函數需要在一個被應用的另一個說法不同的數據集

+0

不幸的是,因爲包是不是CRAN但我無法測試這個解決方案。有沒有一個發佈日期將在cran上的日期?沒有使用版本0.6.0,是否還有一個解決方法? –

+0

@TobiasDekker你可以使用'devtools'從github安裝它https://github.com/tidyverse/dplyr – akrun