问题描述
我想优化我的代码。
我正在使用 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