在 R 中格式化 Phone 个数字

Formatting Phone Numbers in R

所以我有一个 phone 没有标准格式的数字列表,因此它们可以是 (123)-456-7890、1234567890、456890、456-7890。

我想查看我的 phone 号码列表并将它们格式化为 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
         }

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

我希望将 phone 个长度为 10 的数字的输出格式设置为 123-456-7890,将 phone 个长度为 7 的数字的格式设置为 123- 4567.对于无效条目,应将其删除。

谢谢!!!

像这样,

p <- c("(123)-456-7890", "1234567890", "456890  ", "456-7890", "   (123)-4567890")
p
# >[1] "(123)-456-7890"   "1234567890"       "456890  "         "456-7890"        
# >[5] "   (123)-4567890"
p <- trimws(gsub("[[:punct:]]", "", p))
# > # p <- gsub("[-,),(]", "", p) ) # altrenative, but does not remove whitespace!
p
# >[1] "1234567890" "1234567890" "456890"     "4567890"    "1234567890"
p[!nchar(p) %in% c(10)] <- NA
p
# >[1] "1234567890" "1234567890" NA           NA           "1234567890"
p <- gsub("(^\d{3})(\d{3})(\d{4}$)", "\1-\2-\3", p)
p
# >[1] "123-456-7890" "123-456-7890" NA             NA             "123-456-7890"
p <- p[!is.na(p)] # to remove NA's
p
# >[1] "123-456-7890" "123-456-7890" "123-456-7890"

基于 Eric 的回答并尝试将所有部分放在一起,我认为这就是我的处理方式。

关键步骤是

  1. 删除所有标点符号。此时,一切都应该是数字或字符值。
  2. 将所有 phone 不是 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)

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

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