Удалите все нечисловые символы, добавьте «-» и переместите значения по определенным критериям в R - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть образец набора данных ниже, в котором я хочу: 1) Удалите все нечисловые символы, такие как буквы, скобки и т. Д. 2) Если в одном столбце имеется более одного телефона (до 4), каждый номер телефона следует переместить в новый столбец. 3) Все телефоны должны быть преобразованы в форму: 999-999-9999

dt<-data.frame(phone1<-c("B: 2125281108 L: 6315378589","B: 6312047931","B: 646 471 7491","H: ( 212) 2066001 B: 2127665050","H: ( 5165264459","H: 845 735 6340 B: 212 752 6164 L: 631 537 6333 Cell 1: 845 596 6036","H: 9195333092 L: 6312670794 Cell 1: 5188211814","H: 7188366395 B: 7188364600 x1115 L: 6312834294 house # tenant","H: 6315372000 (L allyHamp Country) B: 6315372000 (L ally #) L: 6315375012"))
colnames(dt)<-c("phone1")

Я бы использовал gsub(), но исходный набор данных слишком велик, поэтому я хотел бы использовать универсальное решение, которое сохраняло бы только цифры (телефонные номера), а затем выполняло бы требования 2 и 3. Я работаю в Excel, но хотел бы знать, есть ли способ автоматически достичь этого через R.

Например, этот фрагмент кода gsub("("," ", dt$phone1) заменит все "(" на "", но, поскольку в столбце есть разные типы нецифровых символов и букв, я хочу решение, в котором мне не придется заменять каждый конкретный символ но только чтобы сохранить цифры.

1 Ответ

0 голосов
/ 06 сентября 2018

Сначала мы разделимся на второй столбец, если у нас есть второй номер телефона, основанный на двоеточии, с префиксом буквы, который появляется где-то, кроме начала строки

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   

Если у вас есть коды городов в некоторых номерах, вам сначала нужно проверить длину номера, а затем отформатировать соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...