gpt4 book ai didi

r - 在大型数据集上优化 sapply-grepl

转载 作者:行者123 更新时间:2023-12-03 19:36:00 25 4
gpt4 key购买 nike

我有一个大数据集 (df) ~250.000 个观察值,其中包括一个 cleanText 列(其中包含从任何数字、标点符号、大写字母等中清除的文本),并且我有一个公司名称列表。我想检查 df$cleanText 中的每个观察值是否与列表中公司名称的公司匹配,并计算它找到的匹配项数量并存储它。我的代码可以运行,但是执行需要大约 20 个小时,我觉得它可以更快。

到目前为止,我还没有弄清楚什么是可行的。

# Start for loop for each row in df
for(i in 1:nrow(df)){

# store matches in companyNameMatch, make sure the paste0 includes \\b to match whole strings
companyNameMatch <- sapply(list_Companies, function(x) grepl(paste0(x, "\\b"), as.character(df$cleanText[i])))

# Calculate the number of matches and store it
df$companyNameMatch[i] <- as.numeric(length(which(companyNameMatch != 0)))
}

我希望代码能够在几个小时左右的时间内运行。

例子

cleanText <- c("keeping a cool head takes practice nike",
"playing soccer on these adidas",
"just having a laugh",
"nike and adidas perform better than crocs")

list_Companies <- c("nike", "adidas", "crocs", "puma")

对于 df$cleanText 中的每一行,sapply 函数应检查是否与 list_Companies 中的行匹配。这种情况下的结果看起来是这样的:

df$companyNameMatch[1] = 1
df$companyNameMatch[2] = 1
df$companyNameMatch[3] = 0
df$companyNameMatch[4] = 3

最佳答案

您可以将sapplyrowSums一起使用

df$companyNameMatch <- rowSums(sapply(list_Companies, function(x) grepl(x, cleanText)))

使用 microbenchmark-package 我们可以看到这明显提高了速度:

Unit: microseconds
expr min lq mean median uq max neval cld
rowSums 65.382 78.496 132.345 93.511 119.55 1462.727 100 a
for_loop 6206.326 6920.394 11170.353 7340.814 10058.53 170440.373 100 b

关于r - 在大型数据集上优化 sapply-grepl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56017953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com