2017-08-11 23 views
0

如果我不想在調用該函數之前指定列,我將如何創建一個函數來刪除列中的NA值?如何以編程方式過濾dplyr中的列?

minimal_case <- function(column_name = "a") { 
    enquo_name <- enquo(column_name) 

    example <- tibble(a = c(NA, 1)) 

    print(filter(example, !is.na(a))) 

    print(filter(example, !is.na(rlang::UQ(enquo_name)))) 

} 

第一個print語句的輸出是:

# A tibble: 1 x 1 
     a 
    <dbl> 
1  1 

第二print語句的輸出是:

# A tibble: 2 x 1 
     a 
    <dbl> 
1 NA 
2  1 

我如何獲得的第二個print語句來匹配第一?

+0

'函數(DF,X)DF [!is.na(DF [X]),]' –

+2

如果您提供的字符串作爲列名,你正在使用標準評估,可以跳過整個tidyeval業務。 –

回答

1

看來column_name參數是一個字符串。在這種情況下,你可以使用rlang::sym

minimal_case <- function(column_name = "a") { 
    example <- tibble(a = c(NA, 1)) 

    print(filter(example, !is.na(a))) 

    print(filter(example, !is.na(!!rlang::sym(column_name)))) 

} 
+0

指的是'rlang'非常有幫助;我已經看到了'dplyr'的平靜的東西,但'rlang :: sym'看起來像是一種直接轉換使用舊式風格的函數的方式,例如, 'mutate_'調用quards。 – mikeck

+0

dplyr也會很快導出'sym()'。 sym()和函數的功能是互補的。 – lionel

1

有如何在dplyr這裏做這樣的事情一個很好的寫了起來:http://dplyr.tidyverse.org/articles/programming.html

這種情況的點睛之筆是,你不必須在參數中引用a。您還可以使用!!代替UQ

minimal_case <- function(column_name = a) { 
    enquo_name <- enquo(column_name) 

    example <- tibble(a = c(NA, 1)) 

    print(filter(example, !is.na(a))) 

    print(filter(example, !is.na(!!enquo_name))) 

} 
+0

我不會調用變量'column_name',因爲「列名」讓我想到字符串,例如'colnames()'的輸出。在你的版本中,它也不一定是一個列符號,它也可能是一個表達式。 – lionel

相關問題