我尝试使用a
,dplyr::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()
方法解决此问题的任何想法?非常感谢您的提前帮助!
答案 0 :(得分:1)
只需取出过滤调用中的第一个a
。
代替:
test_char %>%
filter(a, str_detect(a, "2"))
使用:
test_char %>%
filter(str_detect(a, "2"))
应该工作。
过滤器函数中的第一个也是唯一的参数应该是str_detect(col,“ string”)。
希望有帮助!