【问题标题】:Cleaning data in R: parsing a complex string在 R 中清理数据:解析复杂的字符串
【发布时间】:2015-10-21 01:59:12
【问题描述】:

我在包含邮政编码和城市的数据集中有一列。我需要清理它,只留下城市的名称。问题是邮政编码有时在城市名称之前,有时在城市名称之后:

52064 Aachen 
1000 EA Amsterdam 
6411 EJ Heerlen 
Johannesburg 
Dublin 2 
3600 AA Maarssen 
75591 Paris Cedex 12 
7302 HA Apeldoorn

我需要把它清理干净

Aachen 
Amsterdam 
Heerlen 
Johannesburg 
Dublin
Maarssen 
Paris 
Apeldoorn

有人知道怎么做吗?

【问题讨论】:

  • gsub("[0-9]", "", yourData) 摆脱数字
  • 你会怎么处理75591 Paris Cedex 12?您可能想要建立一些正则表达式规则或有一个方便的城市名称数据库
  • 您可以使用library(maps) 获取world.cities$name 并使用grepgsub 提取城市名称。
  • @akrun,也想过这个问题。它适用于较大的城市,列表中约有 43,000 个城市。如果有村庄呢?
  • @SerbanTanasa OP 的描述是column in a dataset with postcode and cities。如果你说的是world.cities,我没查过。

标签: r string parsing


【解决方案1】:

一种方法是使用gsub,并使用以下代码的增强版本:

gsub("^ *| *$","",gsub("[0-9]|[A-Z]{2}|Cedex","",mydata))

[1] "Aachen"       "Amsterdam"    "Heerlen"      "Johannesburg"
 "Dublin"       "Maarssen"     "Paris"        "Apeldoorn"

在英语中,我要求它首先删除数字 [0-9] 然后添加 OR 条件 | 然后要求它删除两个大写字母一个接一个出现的任何实例,另一个或,然后删除特定的邮政像 Cedex 这样的标记。我将它包装在另一个 gsub 中,以处理任何初始 ^ 或最终 $ 常规空格。

或者,您可以尝试@akrun 的建议,即使用library(maps) 获取world.cities$name(四万三千个地区)并针对它提取一些矢量化正则表达式,但我遇到了重复问题,即'York' vs我的玩具示例中的“纽约”。

world.cities$name[(unlist(lapply(world.cities$name, grepl, "52064 Aachen ")))]
[1] "A" "Aachen"

【讨论】:

  • 我没有测试它,因为我正在关注 Richard Scriven 的 cmets。看起来this 可能是一个选项。
  • 感谢 Serban,成功了!并感谢您的解释。
猜你喜欢
  • 2023-03-16
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
  • 2013-01-06
相关资源
最近更新 更多