我正在制作一个闪亮的应用程序,我想显示联系人的电话号码。如果该号码是美国号码,我想以特定格式显示,例如(XXX) XXX- XXXX
否则我只想按原样返回该号码。
我使用substr
尝试了最简单的方法。这是我的功能。
telFormat <- function(x){
if (is.na(x)){
return ("")
}
if(substr(x,1,3) %in% c("+1 ")){
p1 <- substr(x,4,6)
p2 <- substr(x,8,10)
p3 <- substr(x, 12,15)
return (paste("(",p1,") ",p2,"-",p3, sep = ""))
}
else
return (x)
}
我的样本数据是:
sample <- c("+1 312 252 7546", "+1 678 538 1919", "+44 (0) 207 743 4052",
"+44 (0) 207 743 3000", "+1 212 810 5300", NA, "+44 (0) 207 591 6630",
"+61 2 9272 2200", "+852 3903 2448", "+1 415 670 6267", "+44 (0) 207 743 3000",
"+1 212 810 5300", "+1 919 743 2500", "+1 919 743 2500", "+1 919 743 2500",
"+1 919 743 2500")
以+1
开头的电话号码输出正确转换,但其他数字有问题。
telFormat(sample)
#output
[1] "(312) 252-7546" "(678) 538-1919" "( (0) 20- 743" "( (0) 20- 743" "
(212) 810-5300" "(NA) NA-NA" "( (0) 20- 591"
[8] "( 2 ) 272-2200" "(2 3) 03 -448" "(415) 670-6267" "( (0) 20- 743" "
(212) 810-5300" "(919) 743-2500" "(919) 743-2500"
[15] "(919) 743-2500" "(919) 743-2500"
我也收到了这条警告信息
Warning messages:
1: In if (is.na(x)) { :
the condition has length > 1 and only the first element will be used
2: In if (substr(x, 1, 3) %in% c("+1 ")) { :
the condition has length > 1 and only the first element will be used
我在这里做错了什么?有没有一种有效的方法来获得所需的输出?
答案 0 :(得分:0)
如果您数据中的所有美国号码都有特定格式,即+1 XXX XXX XXXX
,您可以使用正则表达式^\\+1 (\\d{3}) (\\d{3}) (\\d{4})$
重新格式化:
sub("^\\+1 (\\d{3}) (\\d{3}) (\\d{4})$", "(\\1) \\2-\\3", sample)
# [1] "(312) 252-7546" "(678) 538-1919" "+44 (0) 207 743 4052"
# [4] "+44 (0) 207 743 3000" "(212) 810-5300" NA
# [7] "+44 (0) 207 591 6630" "+61 2 9272 2200" "+852 3903 2448"
#[10] "(415) 670-6267" "+44 (0) 207 743 3000" "(212) 810-5300"
#[13] "(919) 743-2500" "(919) 743-2500" "(919) 743-2500"
#[16] "(919) 743-2500"
这使用带括号的捕获组来匹配美国数字中的前三个,后三个和后四个数字,请参考这些模式,并使用后面引用\\
并将数字作为替换。
答案 1 :(得分:0)
可能有点像这样的帮助stringr
library(stringr)
as.data.frame(do.call(rbind, lapply(str_match_all(sample[!is.na(sample)],
"(\\+1|.*)[^\\d]?(\\d+)[^\\d]+(\\d+)[^\\d]+(\\d+)$"), function(x) x[,2:5])))
V1 V2 V3 V4
1 +1 312 252 7546
2 +1 678 538 1919
3 +44 (0) 20 7 743 4052
4 +44 (0) 20 7 743 3000
5 +1 212 810 5300
6 +44 (0) 20 7 591 6630
7 +61 2 9272 2200
8 +85 2 3903 2448
9 +1 415 670 6267
10 +44 (0) 20 7 743 3000
11 +1 212 810 5300
12 +1 919 743 2500
13 +1 919 743 2500
14 +1 919 743 2500
15 +1 919 743 2500