Выполнение набора шаблонов регулярных выражений на 18 миллионах строк данных будет крайне неэффективным, и, как уже отмечали другие комментаторы, коды вызова стран могут содержать более или менее 2 цифр, поэтому вы, вероятно, столкнетесь со значительнымидругие проблемыПри этом вы можете использовать одну из функций семейства apply
для запуска каждой строки данных через одну из функций семейства grep
для сопоставления произвольно длинных начальных цифр, подобных этой ...
PhoneNumber <- c("52431", "44781", "1512234", "21234567", "N/A")
CountryCode <- c("52", "44", "1", "212")
CountryName <- c("Mexico", "UK", "USA", "Morocco")
regex <- paste0("^", CountryCode)
matchname <-
sapply(PhoneNumber, USE.NAMES = FALSE, function(x) {
matches <- sapply(regex, function(y) grepl(y, x))
if (any(matches)) {
CountryName[matches]
} else {
NA_character_
}
})
data.frame(PhoneNumber, matchname)
# PhoneNumber matchname
# 1 52431 Mexico
# 2 44781 UK
# 3 1512234 USA
# 4 21234567 Morocco
# 5 N/A <NA>
Вы можете столкнуться с проблемами, если код вызова страны плюс первая цифра телефонного номера совпадают с кодом вызова другой страны, но, насколько я понимаю, коды вызова стран и коды городов обычно предназначены для того, чтобы этого избежать.
Я бы посоветовал найти надежный способ отделения телефонных кодов страны от ваших телефонных номеров, а затем выполнить точное сопоставление на уровнях вектора телефонных кодов вашей страны, чтобы сделать его существенно более эффективным.