2012-02-08 36 views
5

Giả sử tôi có hai cột tên. Tất cả các tên trong cột đầu tiên nằm trong cột thứ hai, nhưng theo thứ tự ngẫu nhiên, VÀ một số trong số đó không phải là các kết quả khớp hoàn hảo. Vì vậy, có thể trong một cột có tên John Smith và trong John_smith thứ hai hoặc JonSmith. Có cách nào R khá đơn giản để thực hiện một "trận đấu hay nhất" không?Kết nối chuỗi không hoàn hảo

+0

Nếu bạn có nhiều cột hơn chỉ tên và họ (ví dụ: bạn cũng có ngày sinh và địa chỉ, hoặc bất kỳ thứ gì) và muốn tìm các hàng có thể khớp, hãy xem gói 'RecordLinkage'. http://cran.r-project.org/web/packages/RecordLinkage/index.html –

Trả lời

10

Với một số dữ liệu như thế này:

df<-data.frame(x=c('john doe','john smith','sally struthers'),y=c('John Smith','John_smith','JonSmith')) 

Bạn có thể nhận được một chặng đường dài với một vài gsub s và tolower:

df$y.fix <- gsub('[[:punct:]]', ' ', df$y) 
df$y.fix <- gsub(' ', '', df$y.fix) 
df$y.fix <- tolower(df$y.fix) 
df$x.fix <- tolower(gsub(' ', '', df$x)) 

Sau đó agrep là những gì bạn sẽ muốn:

> agrep(df$x.fix[2], df$y.fix) 
[1] 1 2 3 

để biết thêm các chuỗi khó hiểu phức tạp, hãy xem this post from last week.

+1

Bạn đã đi trước tôi một chút. –

+0

Joris, hiệp sĩ không chết. –

+0

+1 cho 'tolower()' và 'gsub()' ra những thứ mà nếu không sẽ bị vượt quá khoảng cách levenshtein. –

Các vấn đề liên quan