在R中,如何将两列与正则行,逐行进行比较?

时间:2017-07-13 21:00:23

标签: r regex dplyr

我有一个数据框(实际上是一个tibble)df,有两列,ab,我想过滤掉{{1}的行}是a的子字符串。我试过了

b

但是我收到一条警告,似乎表明R实际上正在应用df %>% dplyr::filter(grepl(a,b)) ,第一个参数是整个grepl

  

有没有办法将一个涉及两个不同列的正则表达式应用于tibble(或数据框)中的每一行?

3 个答案:

答案 0 :(得分:4)

如果您只对行间比较感兴趣,可以使用rowwise()

df <- data.frame(A=letters[1:5],
             B=paste0(letters[3:7],letters[c(2,2,4,3,5)]),
             stringsAsFactors=F)

df %>% 
   rowwise() %>% 
   filter(grepl(A,B))

       A      B
1      b     db
2      e     ge

<强> -------------------------------------------- -------------------------------------
如果您想知道row-entry of A中是否有all of B

df %>% rowwise() %>% filter(any(grepl(A,df$B)))

      A     B
1     b    db
2     c    ed
3     d    fc
4     e    ge

答案 1 :(得分:1)

或使用base R apply和@ Chi-Pak的可重现示例

df <- data.frame(A=letters[1:5],
                 B=paste0(letters[3:7],letters[c(2,2,4,3,5)]),
                 stringsAsFactors=F)

matched <- sapply(1:nrow(df), function(i) grepl(df$A[i], df$B[i]))

df[matched, ]

结果

  A  B
2 b db
5 e ge

答案 2 :(得分:1)

您可以使用stringr::str_detect,它在字符串和模式上进行矢量化。 (正如您所指出的那样,grepl仅在其字符串参数上进行矢量化。)

使用@Chi Pak的例子:

library(dplyr)
library(stringr)

df %>% 
  filter(str_detect(B, fixed(A)))
#   A  B
# 1 b db
# 2 e ge