[英]R dplyr write function for logical expression in filter
我想自動化dplyr::filter
或dplyr::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.