用 lapply 替换应用函数

Replace apply function with lapply

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

第一个数据集 (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

我想要的最终输出应该是这样的 字 1 字 2 total_occ 空气 10 1 机场 20 3 汽车 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)

Error in x[, "pattern"] : incorrect number of dimensions

请让我知道我应该对 运行 lapply 做哪些正确的更改。

为什么不 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)))