2017-04-13 68 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