当字符串作为R

时间:2018-11-28 21:17:19

标签: r dataframe grep grepl

我想找到给定查询的精确匹配项(下面的示例正在查询“ ABC”。但是,我希望所有带有ABC的行都完全相同或由逗号分隔。这意味着我希望输出如下。

样本数据:

query = c('ABC')

col1 = c("ABC", "DEF", "ABCDE", "DAC", "CBA,ABC,LMN1")
col2 = c("DEF", "EQ", "AC", "DE,ABC", "QSX")
col3 = c(12, 30, NA, 0, 54)
df = data.frame(col1, col2, col3)

所需的输出:

            col1      col2     col3
1            ABC       DEF       12
4            DAC    DE,ABC        0
5   CBA,ABC,LMN1       QSX       54

我尝试使用grepl,但得到以下提示(请参阅标记为3的行)。

df[with(df, grepl(query, col1)|grepl(query, col2)),]

我的输出(不需要):

            col1      col2     col3
1            ABC       DEF       12
3          ABCDE        AC       NA
4            DAC    DE,ABC        0
5   CBA,ABC,LMN1       QSX       54

确保获得所需行的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

我们在“查询”中需要一个单词边界。遍历各列,将greplReduce应用于带有vector的单个逻辑|,并用它来对行进行子集化

queryN <- paste0("\\b", query, "\\b")
df[Reduce(`|`, lapply(df[1:2], grepl, pattern = queryN)),]
#           col1   col2 col3
#1          ABC    DEF   12
#4          DAC DE,ABC    0
#5 CBA,ABC,LMN1    QSX   54

或使用OP的方法

df[with(df, grepl(queryN, col1)|grepl(queryN, col2)),]