【问题标题】:Partial string matching & replacement in RR中的部分字符串匹配和替换
【发布时间】:2016-09-14 12:01:45
【问题描述】:

我有一个这样的数据框

> myDataFrame
           company
1   Investment LLC
2    Hyperloop LLC
3 Invezzstment LLC
4   Investment_LLC
5   Haiperloop LLC
6   Inwestment LLC

我需要匹配所有这些模糊字符串,所以最终结果应该是这样的:

> myDataFrame
           company
1   Investment LLC
2    Hyperloop LLC
3   Investment LLC
4   Investment LLC
5    Hyperloop LLC
6   Investment LLC

所以,实际上,我必须解决分类变量的部分匹配和替换任务。基本 R 和包中有很多很棒的函数可以解决字符串匹配问题,但我坚持为这种匹配和替换找到一个单一的解决方案。 我不在乎哪个事件会取代其他事件,例如“Investment LLC”或“Invezzstment LLC”都一样好。只需要它们一致

是否有任何单一的多合一功能或循环?

【问题讨论】:

  • 你能描述一下你到目前为止所做的尝试吗?例如,为什么 base::agrep 不适合你?
  • 亲爱的@Calimo,base::agrep 在查找相似字符串方面工作得很好,但我不能强迫他逐行替换字符串。我尝试了一些 for 和 while 循环,但没有运气。算法应该如下: 1) R 在向量中找到一个字符串 2) 将它与其他字符串进行比较是向量 3) 每个与其相似的字符串(提供一些距离测量),必须用该字符串替换。跨度>
  • 请发布您已有的代码,以便我们从那里获取。顺便说一句,我从您对答案的评论中了解到,选择拼写错误的Invezzstment LLC 可以吗?
  • @Calimo,我删除了这段代码,并且(不幸的是)在提交期间它没有保存在我的 git 中。无论如何,它几乎没有用,因为它是无效的。我记得我使用了sapply 和部分匹配功能(我认为agrep)。 “Invezzstment LLC”完全没问题。事实上,Invezzstment LLC 和 Investment LLC 是一回事;我需要 R 取其中的 any 并替换所有其他出现,所以我有 one 一个很好的分类变量用于这一类别。当您有超过 50000 条记录和 1200 个唯一值时,找出任何拼写错误的变量将是一项繁琐的工作。

标签: r string-matching data-cleaning


【解决方案1】:

所以,过了一段时间,我得到了这个愚蠢的代码。 注意不是完全自动化的替换过程,因为每次正确的匹配都应该由人工验证,每次我们都需要对 agrep @987654321 进行微调@ 争论。我完全确信有办法让它变得更好更快,但这有助于完成工作。

    ##########
    # Manual renaming with partial matches
    ##########

    # a) Take a look at the desired column of factor variables
    sort(unique(MYDATA$names))   # take a look

    # ****
    Sensthreshold <- 0.2   # sensitivity of agrep, usually 0.1-0.2 get it right
    Searchstring <- "Invesstment LLC"   # what should I search?
    # ****

    # User-defined function: returns similar string on query in column
    Searcher <- function(input, similarity = 0.1) {
      unique(agrep(input, 
                   MYDATA$names,   # <-- define your column here
                   ignore.case = TRUE, value = TRUE,
                   max.distance = similarity))
    }

    # b) Make a search of desired string
    Searcher(Searchstring, Sensthreshold)   # using user-def function 
    ### PLEASE INSPECT THE OUTPUT OF THE SEARCH
    ### Did it get it right?

 =============================================================================#
    ## ACTION! This changes your dataframe!
    ## Please make backup before proceeding
    ## Please execute this code as a whole to avoid errors

    # c) Make a vector of cells indexes after checking output
    vector_of_cells <- agrep(Searchstring, 
                       MYDATA$names, ignore.case = TRUE,
                       max.distance = Sensthreshold)
    # d) Apply the changes
    MYDATA$names[vector_of_cells] <- Searchstring # <--- CHANGING STRING
    # e) Check result
    unique(agrep(Searchstring, MYDATA$names, 
                 ignore.case = TRUE, value = TRUE, max.distance = Sensthreshold))
=============================================================================#

【讨论】:

    【解决方案2】:

    如果您有一个正确拼写的向量,agrep 会相当容易:

    myDataFrame$company <- sapply(myDataFrame$company, 
                                  function(val){agrep(val, 
                                                      c('Investment LLC', 'Hyperloop LLC'), 
                                                      value = TRUE)})
    
    myDataFrame
    #          company
    # 1 Investment LLC
    # 2  Hyperloop LLC
    # 3 Investment LLC
    # 4 Investment LLC
    # 5  Hyperloop LLC
    # 6 Investment LLC
    

    如果您没有这样的向量,您可以巧妙地应用 adist 甚至只是 table 如果正确的拼写比其他的重复更多,它可能会是(虽然不是不在这里)。

    【讨论】:

    • 感谢您的回复,阿利斯泰尔!我没有正确拼写实体的向量。我尝试了你关于 adist 函数的建议,但是,由于记录的 n = 59396,R 无法计算这个字符串距离矩阵,所以这个大矩阵对象超过 26.3 Gb。表是个好主意,我会试试的。
    猜你喜欢
    • 2023-02-16
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    相关资源
    最近更新 更多