2016-10-19 7 views
2

私は検索エンジンであるShinyアプリケーションを構築しようとしています。私は、検索キーワードに基づいてdata.tableを返しています :R data.table%like like AND AND

DT <- data.table(field = c("A_B_C","A_C_D","A_D_A","B_A_D","B_C_F","B_D_K")) 

DT[field %like% "A|B"] 

上記リターンAまたはB を含むすべてのフィールドを私は& Bを持つようにしたい場合:

DT[field %like% "A"][field %like% "B"] 

があります任意の数のキーワードに対して上記を行うことを可能にする構文です。以下のような 何か:

DT[field %like% "A & B & C"] 
+1

は – jangorecki

答えて

5

のみ二つの要素がある場合は、それらを個別に比較し、その後、&を行うと、Mapで使用Reduceを比較するために多くの文字列がある場合は、データセット

DT[field %like% "A" & field %like% "B"] 
# field 
#1: A_B_C 
#2: B_A_D 

のサブセット。

DT[Reduce(`&`, Map(`%like%`, list(field), c("A", "B")))] 
# field 
#1: A_B_C 
#2: B_A_D 
4

それとも、内部でgreplとの組み合わせで、Perlスタイル正規表現を使用することができ、あなたのdata.table

pat <- "(?=.*A)(?=.*B)" 
DT[grep(pat, field, perl = TRUE),] 
# field 
#1: A_B_C 
#2: B_A_D 
+2

も移動する方法を示しでし% 'inlike%'のための良いFRのように聞こえます( "=" * "、x =。)のように、クエリからそのパターンへの変換は、 %>% sub( "\\ s * $"、 ")"、x =。)%>% ' – Frank

+0

' terms < - c( "A"、 "B")のような検索用語のベクトルを使用すると、 ")、' DT [grepl(paste(sprintf( "=。*%s)"、terms)、collapse = "")、field、perl = TRUE)] 'を使うことができます。 – dnlbrky