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