2

我正在创建一个数据集来使用正则表达式计算不同单词组合的聚合值。每行都有一个唯一的正则表达式值,我想检查另一个数据集并找到它出现在其中的次数。

第一个数据集 (df1) 如下所示:

   word1    word2               pattern
   air      10     (^|\\s)air(\\s.*)?\\s10($|\\s)
 airport    20   (^|\\s)airport(\\s.*)?\\s20($|\\s)
   car      30     (^|\\s)car(\\s.*)?\\s30($|\\s)

我要与之匹配的另一个数据集(df2)看起来像

   sl_no    query
   1      air 10     
   2    airport 20   
   3    airport 20
   3    airport 20
   3      car 30

我想要的最终输出应该看起来像 word1 word2 total_occ air 10 1 airport 20 3 car 30 1

我可以通过在 R 中使用 apply 来做到这一点

process <- 
function(x) 
{
  length(grep(x[["pattern"]], df2$query))
}           

df1$total_occ=apply(df1,1,process)

但是由于我的数据集非常大,因此需要花费一些时间。

我发现“parallel”包的“mclapply”功能可用于在多核上运行此类东西,为此我尝试先运行 lapply。它给了我错误说

lapply(df,process)

x[, "pattern"] 中的错误:维数不正确

请让我知道我应该进行哪些更改才能正确运行 lapply。

4

1 回答 1

3

为什么不刚刚lapply()结束pattern

在这里,我刚刚拿出了你的pattern,但这也很容易df$pattern

pattern <- c("(^|\\s)air(\\s.*)?\\s10($|\\s)",
             "(^|\\s)airport(\\s.*)?\\s20($|\\s)",
             "(^|\\s)car(\\s.*)?\\s30($|\\s)")

将您的数据用于df2

txt <- "sl_no    query
   1      'air 10'     
   2    'airport 20'   
   3    'airport 20'
   3    'airport 20'
   3      'car 30'"
df2 <- read.table(text = txt, header = TRUE)

pattern直接迭代就行了

> lapply(pattern, grep, x = df2$query)
[[1]]
[1] 1

[[2]]
[1] 2 3 4

[[3]]
[1] 5

如果您想要问题中建议的更紧凑的输出,则需要lengths()遍历返回的输出(感谢@Frank指出新函数lengths()。))。例如

lengths(lapply(pattern, grep, x = df2$query))

这使

> lengths(lapply(pattern, grep, x = df2$query))
[1] 1 3 1

您可以通过以下方式将其添加到原始数据中

dfnew <- cbind(df1[, 1:2],
               Count = lengths(lapply(pattern, grep, x = df2$query)))
于 2015-06-17T16:07:29.813 回答