2017-06-06 65 views
1

我有下面的代碼。動態dplyr列名計算

COLNAME是過去了。我一直在試圖得到它被評爲COLNAME的價值,但還沒有取得多大成功。我試過了「eval」,「setNames」等。使用「_」,仍然沒有提供成功。

本質上說,如果我的COLNAME = 「MyCol」,我想dplyr鏈執行,就好像最後一行寫着:

mutate(MyCol = ifelse(is.na(MyCol), "BLANK", MyCol))

makeSummaryTable <- function(colName,originalData){ 
    result <- originalData %>% 
    group_by_(colName) %>% 
    summarise(numObs = n()) %>% 
    ungroup() %>% 
    arrange(desc(numObs)) %>% 
    rowwise() %>% 
    mutate_(colName = ifelse(is.na(colName), "BLANK",colName)) 
    return(result) 
} 

回答

5

下面是如何與dplyr 0.6.0做採用新的tidyeval方法進行非標準評估。 (我不知道,如果它做標準評估,至少在一個簡單的方式甚至有可能):

library(dplyr) 

makeSummaryTable <- function(colName, originalData){ 

    colName <- enquo(colName) 

    originalData %>% 
    count(!!colName) %>% 
    arrange(desc(n)) %>% 
    mutate(
     old_col = !!colName, 
     !!quo_name(colName) := if_else(is.na(!!colName), "BLANK",!!colName) 
    ) 
} 

makeSummaryTable(hair_color, starwars) 
#> # A tibble: 13 x 3 
#>  hair_color  n  old_col 
#>   <chr> <int>   <chr> 
#> 1   none 37   none 
#> 2   brown 18   brown 
#> 3   black 13   black 
#> 4   BLANK  5   <NA> 
#> 5   white  4   white 
#> 6   blond  3   blond 
#> 7  auburn  1  auburn 
#> 8 auburn, grey  1 auburn, grey 
#> 9 auburn, white  1 auburn, white 
#> 10  blonde  1  blonde 
#> 11 brown, grey  1 brown, grey 
#> 12   grey  1   grey 
#> 13  unknown  1  unknown 

enquo原來未加引號的列名到一些奇特的物體稱爲quosure。 !!然後unquotes的quosure,以便它可以得到評估,就好像它會直接在功能類型。有關更深入和準確的解釋,請參閱Hadley的"Programming with dplyr"

編輯:我明白了,原來問題是命名與不只是colName所以我更新了我的答案colName用戶提供的價值和新的列。爲了實現這個目標,該quosure需要變成使用quo_name一個字符串(或標籤)。然後,它可以像使用!!那樣「不加引號」,就像常規的安排一樣。唯一要注意的是,由於R不能使表達mutate(!!foo = bar)的頭部或尾部,tidyeval引入了新定義操作符:=(這可能是爲用戶所熟悉從data.table它具有稍微不同的使用)。不同於傳統的賦值運算符=,該:=運營商允許unquoting在右側和左側兩個。

(更新答案使用,在其行,有一個NA數據框來說明,最後mutate的作品。我也用count代替group by + summarize,我放棄了不必要的rowwise