dplyr过滤具有多个正则表达式的列

时间:2017-08-17 16:08:50

标签: r dplyr stringr

我在R中有两个df(meta =一些冗余信息)

DF1:

                id  value1  value2  value3  value4
id1_meta_meta-meta  4.93    13.93   16.8    35.39
id2_meta_meta-meta  28.63   45.43   30.52   61.71
id3_meta_meta-meta  3.35    1.26    7.98    4.43
id4_meta_meta-meta  16.78   50.47   32.48   55.52
id5_meta_meta-meta  474.23  807.71  664.45  442.55
id6_meta_meta-meta  26.26   32.83   24.64   41.58
id7_meta_meta-meta  230.1   202.93  166.71  295.48
id8_meta_meta-meta  651.21  1282.71 1012.28 2650.21

DF2:

V1
id1
id2
id3
id4
id5

问题

尝试根据df2

中的ID过滤df1中的行

代码

library(dplyr)
library(stringr)
df.common = df1 %>%
  filter(str_detect(id, '*_') %in% df2$V1)

错误

Error in filter_impl(.data, quo) : 
  Evaluation error: Syntax error in regexp pattern. (U_REGEX_RULE_SYNTAX).

所需的输出

df.common:

                id  value1  value2  value3  value4
id1_meta_meta-meta  4.93    13.93   16.8    35.39
id2_meta_meta-meta  28.63   45.43   30.52   61.71
id3_meta_meta-meta  3.35    1.26    7.98    4.43
id4_meta_meta-meta  16.78   50.47   32.48   55.52
id5_meta_meta-meta  474.23  807.71  664.45  442.55

2 个答案:

答案 0 :(得分:4)

如果您使用dplyrstringr,也可以考虑这种方法。 str_replace_allgsub类似。 semi_join是一种"过滤器加入"允许您保留仅在df2中找到匹配的记录。

library(dplyr)
library(stringr)

df3 <- df1 %>%
  mutate(id2 = str_replace_all(id, "_.*", "")) %>%
  semi_join(df2, by = c("id2" = "V1")) %>%
  select(-id2)

df3
                  id value1 value2 value3 value4
1 id1_meta_meta-meta   4.93  13.93  16.80  35.39
2 id2_meta_meta-meta  28.63  45.43  30.52  61.71
3 id3_meta_meta-meta   3.35   1.26   7.98   4.43
4 id4_meta_meta-meta  16.78  50.47  32.48  55.52
5 id5_meta_meta-meta 474.23 807.71 664.45 442.55

答案 1 :(得分:2)

  1. 使用gsub修剪id

    中的df1
    • gsub("_.*", "", df1$id)将删除_
    • 之后的所有内容
  2. 检查iddf2$V2被修剪的内容(这将返回行号)

  3. df1

    中提取这些行
    df1[gsub("_.*", "", df1$id) %in% df2$V2, ]