Фильтрация строк на основе частичного соответствия между фреймом данных и вектором - PullRequest
2 голосов
/ 13 февраля 2020

У меня есть фрейм данных, и я хочу отфильтровать его на основе частичного совпадения имен в первом столбце с именами в векторе.

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)

1 Ответ

2 голосов
/ 13 февраля 2020

Мы можем paste элементы вектора в единую строку, свернутую на | и использовать это в grepl или str_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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...