使用Stringr的str_detect()过滤字符向量的行

时间:2018-08-28 12:57:07

标签: r character-encoding dplyr stringr magrittr

我尝试使用adplyr::filter()stringr:: str_detect管道使用正则表达式对字符列magrittr进行子集化,以捕获两个或多个数字的存在。

这似乎仅对数字列有效,并且仅在使用$-运算符直接访问该列时有效:

library(tidyverse)

# Create example data: 
test_num <- tibble(
  a = c(1:3, 22:24))
test_num
#> # A tibble: 6 x 1
#>       a
#>   <int>
#> 1     1
#> 2     2
#> 3     3
#> 4    22
#> 5    23
#> 6    24

test_char <- tibble(
  a = as.character(c(1:3, 22:24)))
test_char 
#> # A tibble: 6 x 1
#>   a    
#>   <chr>
#> 1 1    
#> 2 2    
#> 3 3    
#> 4 22   
#> 5 23   
#> 6 24

# Subsetting numerical columns works:
test_num %>% 
  dplyr::filter(a, stringr::str_detect(a, "\\d{2,}"))
#> # A tibble: 3 x 1
#>       a
#>   <int>
#> 1    22
#> 2    23
#> 3    24

# Subsetting a character columns does not work:
test_char %>% 
  dplyr::filter(a, stringr::str_detect(a, "\\d{2,}"))
#> Error in filter_impl(.data, quo): Evaluation error: operations are possible only for numeric, logical or complex types.

# Wheras subsetting by accessing the column
# using the `$` operator works:
test_char$a %>% 
  stringr::str_detect("\\d{2,}")
#> [1] FALSE FALSE FALSE  TRUE  TRUE  TRUE

test_num$a %>% 
  stringr::str_detect("\\d{2,}")
#> [1] FALSE FALSE FALSE  TRUE  TRUE  TRUE

关于可能是什么问题以及如何使用filter()方法解决此问题的任何想法?非常感谢您的提前帮助!

1 个答案:

答案 0 :(得分:1)

只需取出过滤调用中的第一个a

代替:

test_char %>%
  filter(a, str_detect(a, "2"))

使用:

test_char %>%
  filter(str_detect(a, "2"))

应该工作。

过滤器函数中的第一个也是唯一的参数应该是str_detect(col,“ string”)。

希望有帮助!