2016-10-19 102 views
2

我正在嘗試構建一個Shiny應用程序,它是一個搜索引擎。 我基於搜索的關鍵字返回data.table:R data.table%like%with logical 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

聽起來像是不錯的FR爲'%inlike%' – jangorecki

回答

5

如果只有兩個元素,分別對它們進行比較,然後做一個&和子集的數據集

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

如果有很多的字符串比較使用ReduceMap

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

或者你可以使用Perl樣式正則表達式,結合grepl裏面你data.table

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

也可以顯示如何移動從一個查詢到該模式,如'query =「A(012),(」=「,」=「)。 %>% sub(「\\ s * $」,「)」,x =。)%>% sub(「\\ s *&\\ s *」,「)(?=。*」,x =。) ' – Frank

+0

使用諸如'terms < - c(「A」,「B 「)',你可以使用'DT [grepl(paste(sprintf(」(?=。*%s)「,terms),collapse =」「),field,perl = TRUE)]''。 – dnlbrky