具有多个正则表达式的dplyr筛选器列

具有多个正则表达式的dplyr筛选器列,r,dplyr,stringr,R,Dplyr,Stringr,我在R中有两个df(meta=一些冗余信息) df1: df2: 问题: 尝试基于df2中的ID筛选df1中的行 代码 错误 期望输出 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

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

df1:

df2:

问题: 尝试基于df2中的ID筛选df1中的行

代码 错误 期望输出 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
  • 使用
    gsub
    df1

    • gsub(“.*”,“”,df1$id)
      将删除
      之后的所有内容
  • 检查
    df2$V2
    中修剪的
    id
    是什么(这将返回行号)

  • df1

    df1[gsub("_.*", "", df1$id) %in% df2$V2, ]
    
  • 使用
    gsub
    df1

    • gsub(“.*”,“”,df1$id)
      将删除
      之后的所有内容
  • 检查
    df2$V2
    中修剪的
    id
    是什么(这将返回行号)

  • df1

    df1[gsub("_.*", "", df1$id) %in% df2$V2, ]
    

  • 如果您使用的是<代码> DPLYR 和<代码> StRGRG,您也可以考虑这种方法。code>str\u replace\u all类似于

    gsub
    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
    
    库(dplyr)
    图书馆(stringr)
    df3%
    突变(id2=str\u replace\u all(id,“..*”,”)%>%
    半联接(df2,by=c(“id2”=“V1”))%>%
    选择(-id2)
    df3
    id值1值2值3值4
    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.23807.71664.45442.55
    
    <代码> > p>如果您使用的是代码> dPLYR 和 STRIGRG,您也可以考虑这种方法。code>str\u replace\u all
    类似于
    gsub
    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
    
    库(dplyr)
    图书馆(stringr)
    df3%
    突变(id2=str\u replace\u all(id,“..*”,”)%>%
    半联接(df2,by=c(“id2”=“V1”))%>%
    选择(-id2)
    df3
    id值1值2值3值4
    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.23807.71664.45442.55
    

    它成功了,你能评论一下正在进行的事情吗?这将有助于学习,谢谢,谢谢@sbradbio如果这是你想要的,你可以接受我的答案,但我现在不能,所以5分钟后让我接受,不知道它是怎么工作的,你能评论一下正在进行的事情会有助于学习,谢谢,感谢@sbradbio如果这是您想要的,您可以接受我的答案,但我现在不能,所以5分钟后让我接受,不知道如果您将
    过滤器
    条件更改为
    过滤器(str_detect(id,df2$V1))
    @JakeKaupp,我收到此错误
    警告消息:在stri_detect_regex中(string,pattern,opts_regex=opts(pattern)):较长的对象长度不是较短对象长度的倍数
    它是一个警告,而不是错误,并导致您期望的输出。没错,新手错误表示歉意,但我没有得到我期望的
    >dim(df.common)[1]2 13
    str_detect
    检测字符串并返回TRUE of FALSE,因此您的代码在
    df2
    中查找TRUE或FALSE。相反,请使用
    str_extract
    拉出ID部分,然后使用该部分进行测试:
    str_extract(ID,“ID[0-9]+”)%df2$V1
    中的%s。如果将
    过滤器
    条件更改为
    过滤器(str_detect(id,df2$V1))
    @JakeKaupp我收到此错误
    警告消息:stri_detect_regex(字符串,模式,opts_regex=opts(模式)):较长的对象长度不是较短对象长度的倍数
    这是一个警告,不是一个错误,并会导致您所需的输出。诚然,新手错误表示歉意,但我没有得到我所期望的尺寸(df.common)[1]2 13
    str_detect
    检测字符串并返回TRUE of FALSE,因此您的代码在
    df2
    中查找TRUE或FALSE。相反,请使用
    str_extract
    拉出ID部分,然后使用该部分进行测试:
    str_extract(ID,“ID[0-9]+”)%df2$V1中的%df2
    。我将尝试此方法,但如果我错了,请纠正我@PoGibas答案是一行且简洁的。好吧……如果您只想看到最简洁的答案,我将很快删除我的答案。如果您想了解更多关于
    dplyr
    stringr
    的用法,因为您正在使用这些软件包,我将在这里保留我的答案可选方法。你说什么?当然我已经接受了,绝对正确,也可以是可选方法。我会尝试,但如果我错了,请纠正我@PoGibas答案是一行且简洁的。好吧……如果你只想看到最简洁的答案,我会很快删除我的答案。如果你想了解更多关于使用
    dplyr
    stringr
    既然您正在使用这些软件包,我将在这里保留我的答案作为可选方法。您怎么说?当然我已经完全接受了,您是正确的,它可以是可选方法。
    df1[gsub("_.*", "", df1$id) %in% df2$V2, ]
    
    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