【问题标题】:Ordering telephone numbers订购电话号码
【发布时间】:2019-04-22 13:49:14
【问题描述】:

我有一个如下所示的数据集,电话号码采用不同的数字和格式。

您能帮我使用 R 将它们排序为标准格式吗?

TelephoneData <- data.frame(
  FIRST = c("STAN", "FIONA", "JOHN", "VERA", "ROBERT", "ANGIE", "PAUL", "GEORGE", "JUDITH", "TREVOR", "KEN", "BRIAN", "GLADYS", "MARY", "MARY", "JOSHUA", 
            "BRIAN", "PHILLIP", "KATE", "BRIAN"),
  PHONE = c("+44 1152 195298", "07366 602865", "01160 979447", "01597 501161", "01232 637283", "01296 230679", "(07183) 151418", "(07995) 376450", 
            "(0208) 0511522", "+44 208 3960687", "(01544) 668176", "(07540) 940315", "0208 4137611", "(01472) 119737", "(0208) 6494623", 
            "(01156) 145807", "07731 566115", "(0207) 7270589", "(0207) 7542812", "(01205) 835056")
  )

【问题讨论】:

  • 您能否编辑问题以包含我们可以复制粘贴到 R 中的数据?尝试使用 dput(data) 并将其粘贴到问题中。确保将所有代码行缩进 5 个空格,以便它们也显示为代码,这将使您的答案更具可读性
  • 欢迎来到 StackOverflow!请阅读有关how to ask a good question 的信息以及如何提供reproducible example。这将使其他人更容易帮助您。
  • 那么,你尝试了什么?
  • @user10626943 我编辑了数据,但它的格式可以粘贴到普通格式吗?
  • 不是真的,我只是无聊,所以我粘贴到 notpead,在所有 'IDxxx' 之前按回车,将其保存为 csv 并在 :P 中读取。 Tbh 您的原始数据比您现在拥有的数据要好...您将来应该做的是dput() 整个数据框并将输出粘贴到此处。还要记住缩进,因为它会得到漂亮的灰色背景

标签: r regex stringi


【解决方案1】:

这也可能有用:

TelephoneData$TelNr <- gsub("\\+44", "0", gsub("[() ]", "", TelephoneData$PHONE))   #replace +44 by 0, remove spaces and brackets
TelephoneData$TelNr <- gsub("([0-9]{5})(.*)", "\\1 \\2", TelephoneData$TelNr) #insert space after every 5 chars
TelephoneData <- TelephoneData[order(TelephoneData$TelNr ),] #sort by the column TelNr

给出结果

#     FIRST           PHONE        TelNr
#1     STAN +44 1152 195298 01152 195298
#16  JOSHUA  (01156) 145807 01156 145807
#3     JOHN    01160 979447 01160 979447
#20   BRIAN  (01205) 835056 01205 835056
#5   ROBERT    01232 637283 01232 637283
#6    ANGIE    01296 230679 01296 230679
#14    MARY  (01472) 119737 01472 119737
#11     KEN  (01544) 668176 01544 668176
#4     VERA    01597 501161 01597 501161
#18 PHILLIP  (0207) 7270589 02077 270589
#19    KATE  (0207) 7542812 02077 542812
#9   JUDITH  (0208) 0511522 02080 511522
#10  TREVOR +44 208 3960687 02083 960687
#13  GLADYS    0208 4137611 02084 137611
#15    MARY  (0208) 6494623 02086 494623
#7     PAUL  (07183) 151418 07183 151418
#2    FIONA    07366 602865 07366 602865
#12   BRIAN  (07540) 940315 07540 940315
#17   BRIAN    07731 566115 07731 566115
#8   GEORGE  (07995) 376450 07995 376450

希望这会有所帮助!

【讨论】:

  • 我通过将 TelephoneData$ 添加到 PHONEMUM 中来尝试您的代码; sortedTelNr
  • 你得到你想要的了吗?
  • 不幸的是,没有。它没有给我电话号码列表。
  • 假设你有一个 data.frame data。你有更多的列,包括PHONENUM。然后你可以做data$TelNr &lt;- gsub("\\+44\\s*", "0", gsub("[()]", "", data$PHONENUM)),然后像data &lt;- data[order(data$TelNr ),]一样排序
  • 我输入它为(我的data.frame称为TelephoneData)TelephoneData$TelNr 1 and only the first element will be used 我该怎么办?所有行中的 PHONENUM 列的元素都变成了 \ +44\s .
【解决方案2】:

假设您的数据框被称为data,您可以像这样清理电话号码:

 library(stringi)
 data$PHONENUM <- stri_replace_all_fixed(data$PHONENUM, '+44', '0') #changes +44 to 0
 data$PHONENUM <- gsub("[^0-9.]", "", data$PHONENUM) # removes all white space and ()

然后您可以像这样订购电话号码:

 data[order(data$PHONENUM), ]

这能满足你的需要吗?

编辑:根本不需要lapply,这些函数无论如何都会完成整个列表

【讨论】:

  • 好吧,我应该将电话号码的格式固定如下;从这个格式:(01119) 963864 到这个:01119 963864,从这个格式:(01142) 262574 到这个:01142 262574
  • 第一个代码更改了数字,但是当我输入第二个代码时,它没有给我任何列表结果。
  • 它应该只删除空格和括号。它对我有用,你运行的是什么版本的 R? (使用session_info() 来帮助实现)
  • 我用的是R 3.5.1的版本
  • 嗯,我也是。也许我只是误解了你想要的东西,因为它似乎都按照我想要的方式工作
猜你喜欢
  • 2017-09-13
  • 2018-10-07
  • 2016-04-15
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
  • 2023-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多