2016-12-07 69 views
3

是否有一種方法可以使用dplyr的過濾器函數從數據幀中打印每個過濾器操作過濾器的行數?打印由dplyr的過濾器函數過濾的行數

考慮將其過濾的簡單示例數據幀:

test.df <- data.frame(col1 = c(1,2,3,4,4,5,5,5)) 

filtered.df <- test.df %>% filter(col1 != 4, col1 != 5) 

我想這一段代碼,以輸出:

  • '使用篩選出2行:!COL1 = 4'
  • '過濾出3行使用:col1!= 5'

我到目前爲止嘗試過創建自己的fu n

print_filtered_rows <- function(dataframe, ...) { 
     dataframe_new <- dataframe 
     for(arg in list(...)) { 
      print(arg) 
      dataframe <- dataframe_new 
      dataframe_new <- dataframe %>% filter(arg) 
      rows_filtered <- nrow(dataframe) - nrow(data_fram_new) 
      print(sprintf('Filtered out %s rows using: %s', rows_filtered, arg) 
     } 
    return(dataframe_new) 
} 

但我不能真正掌握什麼......實際上是和如何使用它。我讀過:

http://adv-r.had.co.nz/Functions.html#function-arguments

但是,這並沒有真的幫了我。

+0

另外,看看purrr :: walk(),它將打印函數的副作用並傳輸數據。 –

回答

2

非常接近!你實際上在尋找關於Non-Standard Evaluation的章節。

library(dplyr) 

print_filtered_rows <- function(dataframe, ...) { 
    df <- dataframe 
    vars = as.list(substitute(list(...)))[-1L] 
    for(arg in vars) { 
    dataframe <- df 
    dataframe_new <- dataframe %>% filter(arg) 
    rows_filtered <- nrow(df) - nrow(dataframe_new) 
    cat(sprintf('Filtered out %s rows using: %s\n', rows_filtered, deparse(arg))) 
    df = dataframe_new 
    } 
    return(dataframe_new) 
} 

data(iris) 

iris %>% 
    print_filtered_rows(Species == "virginica", Species != "virginica") %>% 
    head() 
#> Filtered out 100 rows using: Species == "virginica" 
#> Filtered out 50 rows using: Species != "virginica" 
#> [1] Sepal.Length Sepal.Width Petal.Length Petal.Width Species  
#> <0 rows> (or 0-length row.names) 
+0

一個很棒的功能。但是,雖然它在dplyr 0.4上運行,但在dplyr 0.7中不起作用。 –