2015-05-22 32 views
2

我有一個字符向量ř匹配整個單詞

var1 <- c("pine tree", "forest", "fruits", "water") 

和列表

var2 <- list(c("tree", "house", "star"), c("house", "tree", "pine tree", "tree pine", "dense forest"), c("apple", "orange", "grapes")) 

我想與在VAR2字匹配VAR1詞語,並提取最大匹配元件在VAR2。例如,

[[1]] 
[1] "tree" "house" "star" 

具有1場VAR1

[[2]] 
[1] "house"  "tree"   "pine tree" "tree pine" "dense forest" 

已經4場VAR1比賽

[[3]] 
[1] "apple" "orange" "grapes" 

已經0匹配VAR1

和期望的輸出是下面的:

[[2]] 
[1] "house"  "tree"   "pine tree" "tree pine" "dense forest" 

我試圖

sapply(var1, grep, var2, ignore.case=T, value=T) 

沒有得到所期望的輸出。

如何解決?代碼片段將不勝感激。 謝謝。

+0

請檢查我發佈的更新解決方案 – akrun

回答

1

我們爲grepl創建一個模式字符串('pat'),首先將'var1'分開空間'\\s+'。輸出將是一個列表。我們使用sapply來遍歷列表,使用pastecollapse= '|',然後將整個向量摺疊爲一個字符串,並與另一個paste一起使用。 |充當OR,同時使用v1中的grepl作爲模式。 sum矢量('v1')將用於根據問題中描述的條件對list'var2'進行子集化。

pat <- paste(sapply(strsplit(var1, '\\s+'), function(x) 
    paste(unique(c(x, paste(x, collapse=' '))), collapse='|')), 
    collapse='|') 
v1 <- sapply(var2, function(x) sum(grepl(pat, x))) 
v1 
#[1] 1 4 0 
var2[which.max(v1)] 
#[[1]] 
#[1] "house"  "tree"   "pine tree" "tree pine" "dense forest" 
+0

謝謝。你能解釋一下代碼嗎,特別是'\\ s +'和collapse ='|' – user6633625673888

+0

@john添加了一些文字。希望它有幫助 – akrun

+1

它像一個魅力 – user6633625673888