识别电话号码,然后匹配国家/地区代码,然后在栏中指定正确的名称

时间:2018-11-23 17:40:49

标签: r dataframe data-science data-cleansing

我有一个数据帧“ CDR”(呼叫详细记录),其中电话号码的前5位数字,另一个数据帧名为“ CC”,其中包含国家代码和国家名称。

real addon name that you create

我是这样想的:

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

因此,在循环结束时x递增,直到所有国家/地区都匹配,然后我才能将y突变为df1。

我尝试了几种组合的替换,匹配,grepl,str_detect,但我无法获得所需的输出。

希望您能引导我朝正确的方向前进。

1 个答案:

答案 0 :(得分:0)

在1800万行数据上运行一组正则表达式模式将非常低效,而且正如其他评论者已经指出的那样,国家/地区调用代码可能会超过2位或少于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>

如果一个国家/地区的电话代码加上电话号码的第一个数字匹配另一个国家/地区的电话代码,您可能会遇到问题,但据我所知,国家/地区代码和区号通常是为了避免这种情况。 / p>

我建议您寻求一种可靠的方法,首先将国家/地区代码与您的电话号码分开,然后在您的国家/地区代码向量的级别上进行精确匹配,以使其效率大大提高。