删除所有非数字符号,添加“-”并在R中的某些条件下移动值

时间:2018-09-05 23:16:44

标签: r

我在下面有想要的样本数据集: 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 :(得分:1)

首先,如果我们有一个第二个电话号码,该电话号码基于冒号,且字母前缀出现在字符串的开头以外的地方,则我们将其分为第二列

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   

如果区号中包含一些数字,则必须首先检查数字的长度,然后进行相应的格式化。