Сначала мы разделимся на второй столбец, если у нас есть второй номер телефона, основанный на двоеточии, с префиксом буквы, который появляется где-то, кроме начала строки
library(stringr)
# positive lookahead looks for a letter then :
# [^^] means not at the start of the string (it seems, although check the comments, someone may explain why this works, but doesn't do what I think it does)
df2 <- str_split_fixed(dt$phone1, "[^^](?=[[:alpha:]]:)",2)
[,1] [,2]
[1,] "B: 2125281108" "L: 6315378589"
[2,] "B: 6312047931" ""
[3,] "B: 646 471 7491" ""
[4,] "H: ( 212) 2066001" "B: 2127665050"
[5,] "H: ( 5165264459" ""
Удалить все нечисловые символы
df2 <- apply(df2, 2,str_replace_all, "[^\\d]", "")
[,1] [,2]
[1,] "2125281108" "6315378589"
[2,] "6312047931" ""
[3,] "6464717491" ""
[4,] "2122066001" "2127665050"
[5,] "5165264459" ""
Затем, наконец, вставьте тире:
as.data.frame(apply(df2, 2, FUN = function(x) gsub("(^\\d{3})(\\d{3})(\\d{4})$", "\\1-\\2-\\3", x)))
V1 V2
1 212-528-1108 631-537-8589
2 631-204-7931
3 646-471-7491
4 212-206-6001 212-766-5050
5 516-526-4459
Если у вас есть коды городов в некоторых номерах, вам сначала нужно проверить длину номера, а затем отформатировать соответственно.