【问题标题】:Replace apply function with lapply用 lapply 替换 apply 函数
【发布时间】:2015-06-17 15:58:51
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您正在迭代模式,所以这应该是您向lapply 发送的第一个参数,对吧?
  • 这就是你得到这个错误的原因:lapply 将依次对列表的每个元素应用一些函数;所以该函数必须能够对列表的元素进行操作。数据框上下文中的元素是它的列,因此您要求 R 将 process 应用于 df 的每一列。

标签: r apply lapply mclapply


【解决方案1】:

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

【讨论】:

  • 然后lengths 如果他们有最新版本的 R
  • @Frank 是的;我刚刚注意到 Q 的那一部分,因为它没有在任何标记中。现在添加了。
  • 嗯,我看到你已经添加了一个带有length 的版本,但是你可以保持原来的方式并将其包装在新函数lengths 中,例如lengths(lapply(...etc...))
  • @Frank +1 我不知道lengths()!感谢您对这个新功能的提醒。将更新答案。 (lengths() 什么时候进入 R 的?)
  • 是的,确实很方便。需要决定是否开始在我的一些包中使用它。会清理一些代码,但会牺牲对 R 3.2.0 的依赖...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
  • 1970-01-01
  • 2018-11-15
  • 2019-03-16
相关资源
最近更新 更多