我仍然试图理解R中的函数,例如apply,lapply等。据我所知,R中的循环很慢并且避免使用它们是一种很好的做法。然而,制作单行脚本'哪一切都很难。然而,我想忘记循环并切换到bulit-in快速功能。 我的输入数据 - 两个表:
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
如您所见,从字符串中提取特定子字符串(非常随机,内部没有任何模板),并分别在每行的末尾添加。
我在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))
啤酒,非常感谢任何线索。
答案 0 :(得分:3)
我们可以使用str_extract
library(stringr)
L1$sub <- str_extract(L1$string, paste(L2$str, collapse="|"))
L1$sub
#[1] "ABC" "DEF" "GHI" "JKL" "ABC" NA