str_使用外部对象模式检测(以整洁的方式)

str_使用外部对象模式检测(以整洁的方式),r,pattern-matching,tidyverse,R,Pattern Matching,Tidyverse,我想优化我的代码 我正在使用str\u detect进行大量选择,因为我想优化我的代码,以便将来我想选择,基于外部定义的对象定义一个过滤器模式。我可以这样做,但我必须使用as.character()来剥离到对象。有可能以整洁的方式做吗 演示该问题的工作示例。这是经典的方法,它是有效的 > tbl %>% mutate(twentys = case_when( + str_detect(fruit, "20") ~ T) ) # A tibble: 4 x 3

我想优化我的代码

我正在使用
str\u 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     

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

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

tbl我们可以使用
stru-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您看到我的第三个选项了吗?因为我使用
作为.character()
。我在找更整洁的东西。因此,我提出了关于代码优化的问题。@Eric抱歉,在您的问题中没有检查它。我更新了
str_c
谢谢。它不同于as.character()
,但不太整洁。使用Ronak Shah的解决方案,我根本不需要包装我的外部对象,但它是一个基本的R选项
library(dplyr)
library(stringr)
tbl %>%
     mutate(twenty = case_when(str_detect(fruit, str_c(twenty)) ~ TRUE))
tbl %>%
     mutate(twenty = case_when(str_detect(fruit, paste(twenty)) ~ TRUE))
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