Определите номер телефона, затем сопоставьте код страны и затем назначьте правильное имя в столбце - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть фрейм данных «CDR» (Подробные записи вызовов) с первыми 5 цифрами телефонных номеров и еще один фрейм данных под названием «CC» с кодами стран и названиями стран.

PhoneNumber <- c("52431", "44781", "N/A") #18 million rows of data
CDR <- data.frame(PhoneNumber)               
CDR

CountryCode <- c("52", "44")
CountryName <- c("Mexico", "UK")
cc <- data.frame(CountryName, CountryCode)
cc

#The output I desire
C_CountryName <- c("Mexico", "UK", "N/A")
CDR <- data.frame(PhoneNumber, C_CountryName)
CDR

IЯ думал об этом следующим образом:

x <- 1
for(x == 2)
{index of y <- cc$CountryCode where (cc$CountryCode == x) (assigns country 
code to y)
y is then matched in all rows of CDR$PhoneNumber and returns index of 
CDR$PhoneNumbers where y is a partial match of CDR$PhoneNumber.
y <- cc$CountryName where (cc$CountryName == x)
x++
}

Итак, в конце цикла x увеличивается до тех пор, пока не будут сопоставлены все страны, тогда я могу преобразовать y в df1.

Я пробовал, заменить, сопоставить, grepl, str_detect в нескольких комбинациях, но я не могу получить желаемый результат.

Я надеюсь, что вы можете направить меня в правильном направлении.

1 Ответ

0 голосов
/ 26 ноября 2018

Выполнение набора шаблонов регулярных выражений на 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>

Вы можете столкнуться с проблемами, если код вызова страны плюс первая цифра телефонного номера совпадают с кодом вызова другой страны, но, насколько я понимаю, коды вызова стран и коды городов обычно предназначены для того, чтобы этого избежать.

Я бы посоветовал найти надежный способ отделения телефонных кодов страны от ваших телефонных номеров, а затем выполнить точное сопоставление на уровнях вектора телефонных кодов вашей страны, чтобы сделать его существенно более эффективным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...