【问题标题】:str_detect with outside object pattern (in a tidy way ..)str_detect 与外部对象模式(以整洁的方式..)
【发布时间】:2021-03-05 09:26:23
【问题描述】:

我想优化我的代码。

我正在与 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     

【问题讨论】:

    标签: r pattern-matching tidyverse


    【解决方案1】:

    如果您不想将twenty 转换为字符,可以使用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
    

    【讨论】:

      【解决方案2】:

      我们可以使用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, fruit = c("apple 20", "banana 20", "pear 10", 
       "pineapple 10")), class = "data.frame", row.names = c(NA, -4L))
      twenty <- 20
      

      【讨论】:

      • 你看到我的第三个选项了吗?我使用as.character()。我正在寻找更整洁的东西。因此我的问题是关于代码优化
      • @EricFail 抱歉,没有在您的问题中检查。我更新了str_c
      • 谢谢。它与as.character() 不同,但并没有更整洁。使用 Ronak Shah 的解决方案,我根本不需要包装我的外部对象。
      • @EricFail 但它是基本 R 选项
      猜你喜欢
      • 2019-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-04
      • 2016-08-06
      • 1970-01-01
      相关资源
      最近更新 更多