2017-06-06 73 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