一个大字符串上的R gsub,许多模式,一个替换

一个大字符串上的R gsub,许多模式,一个替换,r,regex,string,gsub,R,Regex,String,Gsub,我有: -x:一个500.000个字符串的列表,每个字符串大约200个字符 -lastname:包含40000个常见姓氏的列表 我需要用代码“LASTNAME”替换所有字符串中的所有姓氏。这需要很多时间(小时),我想加快速度 我的第一次尝试是超流,因为它在字符串列表中循环了40000次: for (i in 1:length(lastname)){ x <- gsub(x, pattern = paste0("\\b", lastname[i], "\\b", sep =

我有: -x:一个500.000个字符串的列表,每个字符串大约200个字符 -lastname:包含40000个常见姓氏的列表

我需要用代码“LASTNAME”替换所有字符串中的所有姓氏。这需要很多时间(小时),我想加快速度

我的第一次尝试是超流,因为它在字符串列表中循环了40000次:

for (i in 1:length(lastname)){
        x <- gsub(x, pattern = paste0("\\b", lastname[i], "\\b", sep = ""), replacement = "LASTNAME")
}
for(i in 1:length(lastname)){

x请给出一个小的可重复的例子和预期的输出。我认为更合理的姓氏分组可能会有所帮助。例如,尝试以一种方式将它们分开,即在每个组中,所有姓氏的前两个字母都相似。然后,你将能够构造一个更有效的正则表达式。例如,如果一个组由
“Jones”组成
“Johnson”
,正则表达式将是
“\\bJo[nes | hnson]\\b”
。您可以尝试使用
parSapply
并行方式运行它。如果正则表达式有足够长的执行时间,这可能会产生一些好处。感谢到目前为止提供的信息。对于akrun:对于akrun,我在这里放了一个可复制的代码:请显示一个小的可复制示例和预期的输出对姓氏进行更合理的分组可能会有所帮助。例如,尝试以一种方式将它们分开,即在每个组中,所有姓氏的前两个字母都相似。这样,您就能够构造一个更有效的正则表达式。例如,如果一个组由
“Jones”
“Johnson”
,则正则表达式将是
“\\bJo[nes\hnson]\\b”
。您可以尝试使用
parSapply
parallel
中运行它。如果正则表达式有足够长的执行时间,这可能会产生一些好处。感谢到目前为止提供的信息。对于akrun:对于akrun,我在这里放了一个可复制的代码:
# Function to make the grouped pattern
groupPat <- function(pat0, ng)
{
    # pat0: original list of patterns
    # ng: number of original patterns in one group
    # pat1: new, grouped pattern

    # Length of original pattern
    np0 <- length(pat0)

    # Length of pattern to make
    np1 <- floor(np0/ng)

    if (np1 > 0){
        # Allocate memory
        pat1 <- vector(mode = "list", length = np1)

        # Make new pattern
        for (i in 1:np1-1){
            pat1[i] <- paste0("\\b", pat0[(i*ng+1):((i+1)*ng)], "\\b", collapse = "|")
        }
        pat1[np1] <- paste0("\\b", pat0[(np1*ng+1):np0], "\\b", collapse = "|") 
    } else {
        pat1 <- paste0("\\b", pat0, "\\b", collapse = "|")
    }

    # Output
    pat1    
}


# The actual replacement loop:
pat <- groupPat(lastname, 100)
for (i in 1:length(pat)){
    x <- gsub(x, pattern = pat[i], replacement = "LASTNAME")
}