stringr:查找任何列内容与正则表达式匹配的行

时间:2017-07-14 15:36:02

标签: r regex stringr

考虑以下示例

> data_text <- data.frame(text = c('where', 'are', 'you'),
                        blob = c('little', 'nice', 'text'))
> data_text
# A tibble: 3 x 2
   text   blob
  <chr>  <chr>
1 where little
2   are   nice
3   you   text

我想打印包含正则表达式text的行(即第3行)

问题是,我有数百列,我不知道哪一列包含这个字符串。 str_detect一次只能使用一列...

如何使用stringr包来做到这一点? 谢谢!

3 个答案:

答案 0 :(得分:6)

使用stringrdplyr,您可以执行此操作。

您应该使用filter_all中的dplyr >= 0.5.0

我已扩展数据以更好地了解结果:

library(dplyr)
library(stringr)

data_text <- data.frame(text = c('text', 'where', 'are', 'you'),
                    one_more_text = c('test', 'test', 'test', 'test'),
                    blob = c('wow', 'little', 'nice', 'text'))

data_text %>%
  filter_all(any_vars(str_detect(., 'text')))

# output
  text one_more_text blob
1 text          test  wow
2  you          test text

答案 1 :(得分:4)

您可以将data.frame视为列表,并使用purrr::map检查每一列,然后reduce d成filter可以处理的逻辑向量。或者,purrr::pmap可以并行迭代所有列:

library(tidyverse)

data_text <- data_frame(text = c('where', 'are', 'you'),
                        blob = c('little', 'nice', 'text'))

data_text %>% filter(map(., ~.x == 'text') %>% reduce(`|`))
#> # A tibble: 1 x 2
#>    text  blob
#>   <chr> <chr>
#> 1   you  text

data_text %>% filter(pmap_lgl(., ~any(c(...) == 'text')))
#> # A tibble: 1 x 2
#>    text  blob
#>   <chr> <chr>
#> 1   you  text

答案 2 :(得分:3)

matches = apply(data_text,1,function(x) sum(grepl("text",x)))>0
result = data_text[matches,]

无需其他套餐。希望这有帮助!