2017-04-13 16 views
1

我仍然試圖理解R中的函數,比如apply,lapply等。就我所知,R中的循環很慢,避免它們是一種很好的做法。然而,做一切事情的'單線腳本'是非常困難的。儘管如此,我仍然想忘掉循環並切換到快速啓動功能。 我的輸入數據 - 兩個表:嵌套的lapply來修改表格而不是循環

L1

N Q string 
1 12 NNN|ABC|12.5 
2 46 DEF|111|!-2 
3 34 $$%GHI|--+ 
4 -2 345H*(JKL 
5 50 NK-|224ABC 
6 0 NNNNNNNNN 

L2

str 
ABC 
DEF 
GHI 
JKL 
MNO 
PRS 

什麼我想要得到:

N Q string   sub 
1 12 NNN|ABC|12.5 ABC 
2 46 DEF|111|!-2  DEF 
3 34 $$%GHI|--+ GHI 
4 -2 345H*(JKL  JKL 
5 50 NK-|224ABC  ABC 
6 0 NNNNNNNNN  NA 

正如你看到的具體蘇bstring是從字符串中提取的(非常隨機,裏面沒有任何模板),並分別添加在每行的末尾。

我在R中創建了一個簡短的腳本,它允許這樣做,但在我的非假數據表中,L1有超過80000行,表L2超過250000行,所以這個簡單的操作可能需要一點時間。

L1 <- cbind(sub=NA,L1) 
L1 <- subset(L1, select=c(N:string,sub)) 
for(i in 1:nrow(L2)){ 
    for(j in 1:nrow(L1)){ 
    if(grepl(L2[i,1], L1[j,3])){ 
     L1$sub[j] <- toString(L2$str[i]) 
    } 
    } 
} 

我在想嵌套lapply,但我怎麼才能到達具體的索引? 超僞代碼:

lapply(L1, function(x) lapply(L2, function(y) if(L2 in L1) add L2 to L1 else add NA)) 

啤酒和巨大的感謝任何線索。

回答

3

我們可以使用str_extract

library(stringr) 
L1$sub <- str_extract(L1$string, paste(L2$str, collapse="|")) 
L1$sub 
#[1] "ABC" "DEF" "GHI" "JKL" "ABC" NA 
+2

如果要解釋這樣一種可能性,在L1的字符串可以匹配L2不止一個模式(例如'L1 $字符串[1] < - 「NNN | ABC你可以使用'str_extract_all':'L1 $ sub < - stringr :: str_extract_all(L1 $ string,paste(L2 $ str,collapse =「|」))%> lapply(粘貼,摺疊=「,」)%>%unlist%>%replace(。,。==「」,NA)'。 – ikop

+1

啊,真是太神奇了:D – Adamm

+1

我只想補充一件事。在對我的解決方案和上面給出的解決方案稍作修改後,我在我的數據上運行了兩個腳本,並測量了時差:我的解決方案:**時差48.31354分鐘**給定解決方案:**時差30.6875秒**。再一次,非常感謝! – Adamm