簡體   English   中英

R dplyr 為過濾器中的邏輯表達式寫入 function

[英]R dplyr write function for logical expression in filter

我想自動化dplyr::filterdplyr::case_when等語句中的邏輯表達式。 對於可重現的示例,請考慮mtcars和一個名為id的特殊列:

library(tidyverse)
dd <- mtcars %>% as_tibble() %>% mutate(id = letters[1:32])

目標是獲得與

identifier <- "d"
dd %>%
  filter(id == identifier)

通過使用 function 而不是邏輯表達式,就像這樣

identifier <- "d"
is_id <- function(foo_id){
  # body
}
dd %>%
  filter(is_id(identifier))

目標是創建一個 function is_id ,它返回過濾器使用的邏輯表達式。 因此,function is_id <- function(car_id){ #body }應該計算表達式dd$id == foo_id並返回其結果的邏輯向量。 這應該在不重復 .data 參數(在這種情況下為 dd )的情況下實現,例如不是filter(dd, is_id(dd, "c"))

有沒有辦法做到這一點,如果有,怎么做?

根據您的數據,它可能不是超級性能,但您可以在自定義 function 中使用cur_data_all() 這個 function 也可以在沒有 pipe 的情況下工作,它也可以使用多個標識符。

library(dplyr)

dd <- mtcars %>% as_tibble() %>% mutate(id = letters[1:32])

identifier <- "d"

is_id <- function(x){
  dat <- dplyr::cur_data_all()
  dat[["id"]] == x
}

dd %>%
  filter(is_id(identifier))

#> # A tibble: 1 x 12
#>     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb id   
#>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
#> 1  21.4     6   258   110  3.08  3.22  19.4     1     0     3     1 d

idenfifiers <- c("a", "b")
filter(dd, is_id(idenfifiers))

#> # A tibble: 2 x 12
#>     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb id   
#>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
#> 1    21     6   160   110   3.9  2.62  16.5     0     1     4     4 a    
#> 2    21     6   160   110   3.9  2.88  17.0     0     1     4     4 b

reprex package (v0.3.0) 於 2021 年 2 月 18 日創建

dd <- mtcars %>% as_tibble() %>% mutate(id = letters[1:32])
                                                     

identifier <- "d"

is_id <- function(x){
  data <- x[, "id"]
  rtn <- data == identifier
  return(rtn)
}

dd %>% 
  filter(is_id(.))

# A tibble: 1 x 12
    mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb id   
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
1  21.4     6   258   110  3.08  3.22  19.4     1     0     3     1 d 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM