JodeCharger100
JodeCharger100

Reputation: 1059

Fuzzy match for two variables in a dataset

How do I do a fuzzy match (approximately 75% match) between two variables in a Stata dataset?

In my example, I am producing Match_yes = 1 if the value in Brand_1 is present in Brand_2:

**Brand_1    Brand_2    Match_yes**
Samsung     Samsung         1
Microsoft   Apple           0
Apple       Sony            1
Panasonic   Motorola        0
Miumiu                      0
Mottorrola                  1  
LG                          0

How do I get the value Mottorrola under variable Brand_1 to produce a Match_yes = 1, as it is 80% similar to the value Motorola in variable Brand_2?

Upvotes: 0

Views: 1468

Answers (1)

user8682794
user8682794

Reputation:

Using your toy example:

clear

input strL(Brand_1 Brand_2)
Samsung     Samsung     
Microsoft   Apple          
Apple       Sony           
Panasonic   Motorola       
Miumiu                     
Mottorrola                  
LG                          
end 

Here is a 'hack' using the community-contributed command matchit to produce the desired output:

local obs = _N
generate Cont = 0

forvalues i = 1 / `obs' {
    forvalues j = 1 / `obs' {
        replace Cont = 1 if Brand_1[`i'] == Brand_2[`j'] in `i'

        generate b1 = Brand_1[`i'] in 1
        generate b2 = Brand_2[`j'] in 1
        matchit b1 b2, generate(simscore)
        generate score`i'`j' = simscore
        replace Cont = 1 if score`i'`j'[1] > 0.80 in `i'

        drop b1 b2 simscore
    }
}

drop score*

list

     +------------------------------+
     |    Brand_1    Brand_2   Cont |
     |------------------------------|
  1. |    Samsung    Samsung      1 |
  2. |  Microsoft      Apple      0 |
  3. |      Apple       Sony      1 |
  4. |  Panasonic   Motorola      0 |
  5. |     Miumiu                 0 |
     |------------------------------|
  6. | Mottorrola                 1 |
  7. |         LG                 0 |
     +------------------------------+

Upvotes: 1

Related Questions