【发布时间】:2015-10-07 16:35:47
【问题描述】:
catalog 是具有不同值的字符向量。它具有以下结构
value name location companybrand
1111 ikea boston nike
1234 7/11 new york marlboro
1456 walmart new york marlboro
listing 包含美国所有城市 -> 芝加哥、波士顿、纽约、洛杉矶和另一列有品牌全名的列
Location Brand
New York, 5th Avenue Coca Cola LTD
New York, 51 Str Nike Corporation
New York, Broadway Marlboro Incorporated
if (sum(grepl(paste("\\b", as.character(location), "\\b", sep = ""), catalog$value[i], fixed = FALSE)) > 0 &&
sum(grepl(paste("\\b", as.character(companybrand), "\\b", sep = ""), catalog$value[i], fixed = FALSE)) > 0){
subdata <- subset(listing, listing$local == as.character(location[which(grepl(paste("\\b", as.character(location), "\\b", sep = ""), catalog$value[i], fixed = FALSE)]) && listing$commercial == as.character(companybrand[which(grepl(paste("\\b", as.character(companybrand), "\\b", sep = ""), catalog$value[i], fixed = FALSE))]))
}
如您所见,我正在尝试使用多种模式运行 grepl 函数,但会返回以下错误:
Warning message:
In grepl(paste("\\b", distmunicipality, "\\b", sep = ""), ctlg$distvalor[i], :
argument 'pattern' has length > 1 and only the first element will be used
我在其他帖子中读到,解决此问题的适当方法是将所有要测试的模式折叠成一个带有管道分隔符的字符串,如下所示:
companybrand <- paste(companybrand, collapse = "|")
location <- paste(location, collapse = "|")
这适用于小向量,但在我的情况下,companybrand 中有 400 万个元素,这导致我的 R 因内存不足而终止。有没有一种实用的方法(可能使用 sapply)来运行这个匹配而不需要计算繁重?
【问题讨论】:
-
查看
stringi包。它是 C/++ 支持的,并且大多数操作都通过string和pattern(使用string和pattern)进行矢量化。它可能会明显更快,内存效率更高。 -
你的预期输出是什么?
-
@hrbrmstr 我之前确实使用了 stringr 包,特别是 str_detect 函数来执行它,虽然它有效,但在我看来,对于大量数据来说效率很低,这就是为什么我在假设 R 基函数的计算效率更高的情况下使用了 grepl。我这样想错了吗?
-
@AvinashRaj 我的输出将是数据框“列表”的子集。对于迭代 i 中的给定目录值,它应该找到该字符串中的哪个“位置”和“公司品牌”,并相应地对数据框“列表”进行子集化。如您所知,这是较大代码的一部分,因此是 i 索引。
-
stringi(stringr的基础)将比 base 高效得多(并且还可以处理更广泛的字符数据数组,而不是您现在可能需要它)。它基于site.icu-project.org。如果你不在 Windows 上,你也可以mclapply这个。
标签: regex r string string-matching grepl