在R中格式化电话号码

Mad*_*die 2 if-statement r gsub

因此,我列出了没有标准格式的电话号码,因此可以是(123)-456-7890、1234567890、456890、456-7890。

我想浏览一下我的电话号码列表并将其格式设置为123-456-7890 456-7890

到目前为止,我在R中拥有的是

 phone_num <- gsub("-","", gsub("\\(","", gsub("\\)","", csv_file$Phone)))

 if(nchar(phone_num)== 10) {
    cleaned_phone <-gsub("(\\d{3})(\\d{3})(\\d{4}$)", "\\1-\\2-\\3", phone_num) 
  }
    else if (nchar(phone_num) == 7){
             cleaned_phone <-gsub("(\\d{3})(\\d{4}$)", "\\1-\\2", phone_num)
    }
         else (nchar(phone_num) != 7 || nchar(phone_num) != 10){
              cleaned_phone <- #delete entry
         }
Run Code Online (Sandbox Code Playgroud)

但是我遇到了错误-有什么想法吗?

我希望输出的长度为10的电话号码格式为123-456-7890,长度为7的电话号码格式为123-4567。对于无效的条目,应将其删除。

谢谢!!!

Ben*_*min 5

在埃里克(Eric)的答案的基础上,尝试将所有内容放在一起,我想这就是我要去做的。

关键步骤是

  1. 删除所有标点符号。此时,所有内容都应为数字或字符值。
  2. 将所有不是7或10位数字的电话号码设置为NA(或您选择的其他值)
  3. 重新格式化7位数字
  4. 重新格式化10位数字。

我尝试了几种不同的方法,但是这种方法似乎是最有效的。

phone_it_in <- function(phone, invalid = NA)
{
  phone <- gsub("[[:punct:]]", "", phone)          # remove punctuation
  phone <- trimws(phone)                           # remove whitespace
  phone[!nchar(phone) %in% c(7, 10)] <- invalid    # keep only 7 or 10 digit numbers
  phone[nchar(phone) %in% 7] <- gsub("(^\\d{3})(\\d{4}$)", 
                                   "\\1-\\2", 
                                   phone[nchar(phone) %in% 7])
  phone[nchar(phone) %in% 10] <- gsub("(^\\d{3})(\\d{3})(\\d{4}$)", 
                                    "\\1-\\2-\\3",
                                    phone[nchar(phone) %in% 10])
  phone
}

phone <- c("(123)-456-7890", "1234567890", "456890", "456-7890")
phone_it_in(phone)
Run Code Online (Sandbox Code Playgroud)

编辑:更改自,invalid = NA因为它导致以下错误:

Error in phone[nchar(phone) == 7] <- gsub("(^\\d{3})(\\d{4}$)", "\\1-\\2", : NAs are not allowed in subscripted assignments
Traceback:
Run Code Online (Sandbox Code Playgroud)