识别 phone 号码,然后匹配国家代码,然后在列中分配正确的名称
Identify phone number, then match country code and then assign correct name in a column
我有一个数据框 "CDR"(通话详细记录),其中包含 phone 号码的前 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
我是这样想的:
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,但我无法获得所需的输出。
希望您能指导我正确的方向。
运行 一组 1800 万行数据的正则表达式模式将非常低效,正如其他评论者已经指出的那样,国家电话代码可以多于或少于 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>
如果国家电话代码加上 phone 号码的第一位左右与另一个国家电话代码匹配,您可能 运行 会遇到问题,但据我所知,国家电话代码和区号通常旨在避免这种情况。
我建议首先寻找一种可靠的方法将国家/地区呼叫代码与 phone 号码分开,然后在您的国家/地区呼叫代码矢量的级别上进行精确匹配,以使其效率大大提高。
我有一个数据框 "CDR"(通话详细记录),其中包含 phone 号码的前 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
我是这样想的:
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,但我无法获得所需的输出。
希望您能指导我正确的方向。
运行 一组 1800 万行数据的正则表达式模式将非常低效,正如其他评论者已经指出的那样,国家电话代码可以多于或少于 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>
如果国家电话代码加上 phone 号码的第一位左右与另一个国家电话代码匹配,您可能 运行 会遇到问题,但据我所知,国家电话代码和区号通常旨在避免这种情况。
我建议首先寻找一种可靠的方法将国家/地区呼叫代码与 phone 号码分开,然后在您的国家/地区呼叫代码矢量的级别上进行精确匹配,以使其效率大大提高。