str_detect 与外部对象模式以整洁的方式.. 数据

问题描述

我想优化我的代码

我正在使用 str_detect 进行大量选择,因为我想针对我想选择的未来优化我的代码,并定义了过滤器模式,基于外部定义的对象。我可以这样做,但我必须使用 as.character() 剥离到对象的路径。是否可以以整洁的方式进行?

演示该问题的工作示例。这是经典的方式,它有效

> tbl %>% mutate(twentys = case_when(
+   str_detect(fruit,"20") ~ T) )
# A tibble: 4 x 3
      x fruit        twentys
  <int> <chr>        <lgl>  
1     1 apple 20     TRUE   
2     2 banana 20    TRUE   
3     3 pear 10      NA     
4     4 pineapple 10 NA     

这就是我想象的我可以做到的,但事实并非如此

> twenty <- 20
> tbl %>% mutate(twentys = case_when(
+   str_detect(fruit,twenty) ~ T) )
Error: Problem with `mutate()` input `twentys`.
x no applicable method for 'type' applied to an object of class "c('double','numeric')"
i Input `twentys` is `case_when(str_detect(fruit,twenty) ~ T)`.
Run `rlang::last_error()` to see where the error occurred.

这是我想要优化的繁琐方法,使用 as.character()

> tbl %>% mutate(twentys = case_when(
+   str_detect(fruit,as.character(twenty)) ~ T) )
# A tibble: 4 x 3
      x fruit        twentys
  <int> <chr>        <lgl>  
1     1 apple 20     TRUE   
2     2 banana 20    TRUE   
3     3 pear 10      NA     
4     4 pineapple 10 NA     

解决方法

如果您不想将 grepl 转换为字符,可以使用 twenty

library(dplyr)
tbl %>% mutate(twentys = case_when(grepl(twenty,fruit) ~ TRUE))

#  x        fruit twentys
#1 1     apple 20    TRUE
#2 2    banana 20    TRUE
#3 3      pear 10      NA
#4 4 pineapple 10      NA

数据

tbl <- structure(list(x = 1:4,fruit = c("apple 20","banana 20","pear 10","pineapple 10")),class = "data.frame",row.names = c(NA,-4L))
twenty <- 20
,

我们可以使用str_detect

library(dplyr)
library(stringr)
tbl %>%
     mutate(twenty = case_when(str_detect(fruit,str_c(twenty)) ~ TRUE))

或用 paste

包裹
tbl %>%
     mutate(twenty = case_when(str_detect(fruit,paste(twenty)) ~ TRUE))

数据

tbl <- structure(list(x = 1:4,-4L))
twenty <- 20