【问题标题】:Filtering rows based on partial matching between a data frame and a vector基于数据框和向量之间的部分匹配过滤行
【发布时间】:2020-05-29 10:02:11
【问题描述】:

我有一个数据框,并希望根据第一列中名称与向量中名称的部分匹配来过滤它。

nam <- c('mmu_mir-1-3p','mmu_mir-1-5p','mmu-mir-3-5p','mir-4','mmu-mir-6-3p') #factor
aa <- c('12854','36','5489','54485','2563') #numeric
df <- data.frame(nam,aa)

vector <- c('mir-1','mir-3','mir-6')

我需要在df$nam 中的名称与vector 中的名称部分匹配的新数据框中包含行。所以new_df 应该是这样的。

new_nam <- c('mmu_mir-1-3p','mmu_mir-1-5p','mmu-mir-3-5p','mmu-mir-6-3p')  #factor
new_aa <- c('12854','36','5489','2563')  #numeric
new_df <- data.frame(new_nam,new_aa)

【问题讨论】:

标签: r dataframe filter match partial


【解决方案1】:

我们可以将paste 'vector' 的元素合并成一个由| 折叠的字符串,然后将greplstr_detect 中的行转换为filter

library(dplyr)
library(stringr)
df %>% 
   filter(str_detect(nam, str_c(vector, collapse="|")))
#           nam    aa
#1 mmu_mir-1-3p 12854
#2 mmu_mir-1-5p    36
#3 mmu-mir-3-5p  5489
#4 mmu-mir-6-3p  2563

base R 中,这可以通过subset/grepl 完成

subset(df, grepl(paste(vector, collapse= "|"), nam))

【讨论】:

  • 类似基R df[grep(paste(vector, collapse = "|"), df$nam), ]
  • 它现在可以工作了,谢谢,但我想知道如果我们不做折叠,而是在不考虑任何前缀或后缀的情况下编写代码来 grep df 中的向量名称。 *-mir-1-* 之类的东西可以在bash 中使用,其中星代表anything 可以在这些位置。
  • @Apex 问题是grep 中的pattern 没有矢量化,即它只需要一个模式。长度为 1。这就是我折叠成单个字符串 wqith | 意思是 OR 的原因。否则,您也可以循环,即 Reduce("|", lapply(vector, grepl, x = df$nam)) 然后 Reduce|
  • @akrun 你能否澄清一下与| 折叠成一个字符串如何帮助grep 在匹配时忽略prefixsuffix
  • @Apex 它正在寻找任何单词,即字符串中的子字符串,如果存在,则返回 TRUE 或 FALSE,即它在每个字符串中查找 mir-1、mir-3、...。最好有一个单词边界来限制边缘情况的匹配
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
  • 2018-04-01
  • 2022-01-22
  • 1970-01-01
相关资源
最近更新 更多