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