Loose string matching for words in postal addresses
You'd better use another strategy:


Find a table of all usual abbreviations used in postal addresses.
Create a new column normalized_street in your original dataframe by replacing all occurrences of abbreviations in column Street by the corresponding full words.
Perform an exact self-join on your original dataframe, by Zip and normalized_street.




Why I think it's better:


It will allow you to avoid false positives like cat street / catfish street
The exact self-join will be very efficient
Your code will be simpler, cleaner, and entirely vectorized




There are lots of things to say about your current code. I'll just point out a few mistakes so that you can avoid them next time:


matched is not initialized
as.vector(props[props$Zip == postal_code,]["Street"]) can be written in a simpler way: props[props$Zip == postal_code, "Street"]
Since streets is a vector, you get its length using length(streets)
For the same reason, you have to use streets[i] instead of streets[[1]][i]
You should use grepl() instead of any(grep())