嵌套lapply来修改表而不是循环

时间:2017-04-13 10:58:10

标签: r loops lapply

我仍然试图理解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))
啤酒,非常感谢任何线索。

1 个答案:

答案 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