首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用一个表达式替换regexp载体?

如何用一个表达式替换regexp载体?
EN

Stack Overflow用户
提问于 2019-10-18 07:33:20
回答 1查看 50关注 0票数 0

我的材料里有一些类似于100+不同村庄的东西。为了让我的想象有意义,我需要把它们组合成22个城市,如下所示:

代码语言:javascript
复制
TROLLHÄTTAN<-toupper(c("Trollhättan","Sjuntorp","Velanda","Åsaka","Upphärad"))
UDDEVALLA<-toupper(c("UDDEVALLA","KURVERÖD","AMMENÄS","FAGERHULT","LANESUND OCH ÖVERBY",
"LANESUND","ÖVERBY","RESTENÄS OCH ULVESUND","RESTENÄS","ULVESUND","STRAND","UTBY","HOGSTORP","SUND","SMEDSERÖD"))
VÄNERSBORG<-toupper(c("Vänersborg","Vargön","Brålanda","Frändefors","Nordkroken","Katrinedal"))
LYSEKIL<-toupper(c("Lysekil", "Brastad", "Grundsund", "Fiskebäckskil"))
FÄRGELANDA<-toupper(c("Färgelanda","Högsäter","Ödeborg","Stigen"))
MELLERUD<-toupper(c("Mellerud","Dals Rostock","Åsensbruk"))
ED<-toupper(c("Ed"))
BENGTSFORS<-toupper(c("Bengtsfors","Dals Långed","Billingsfors","Bäckefors","Skåpafors"))
ÅMÅL<-toupper(c("Åmål","Tösse","Fengersfors"))
STRÖMSTAD<-toupper(c("Strömstad","Skee","Kebal","Stare"))
TANUM<-toupper(c("Grebbestad","Tanumshede","Fjällbacka","Hamburgsund","Rabbalshede"))
SOTENÄS<-toupper(c("Hunnebostrand","Kungshamn","Smögen","Malmön","Bovallstrand"))
MUNKEDAL<-toupper(c("Munkedal","Dingle","Hällevadsholm","Hedekas","Torreby"))
ORUST<-toupper(c("Svanesund","Ellös","Hälleviksstrand","Mollösund","Henån","Höggeröd","Vindön och Töllås","Varekil","Vindön","Töllås"))
LILLA_EDET<-toupper(c("Lilla Edet","Lödöse","Lilla Edet västra","Göta","Nygård","Hjärtum"))
ALE<-toupper(c("Ale","Nödinge-Nol","Surte","Älvängen","Skepplanda","Alvhem"))
STENUNGSUND<-toupper(c("Jörlanda","Stora Höga","Timmervik","Spekeröd","Stenungsund","Stenungsön","Svartehallen","Svenshögen","Ucklum","Ödsmål"))
TJÖRN<-toupper(c("Bleket","Djupvik och Fagerfjäll","Höviksnäs","Klövedal","Kyrkesund och Bö","Kållekärr","Myggenäs","Rönnäng","Skärhamn","Stora Dyrön",
"Djupvik","Fagerfjäll","Kyrkesund","Bö"))
KUNGÄLV<-toupper(c("Aröd och Timmervik","Diseröd","Duvesjön","Harestad och Nereby","Kareby","Kode","Kovikshamn","Kungälv","Kärna",
"Lundby","Marstrand","Marstrand", "Arvidsvik","Risby","Rishammar","Signehög och Norrmannebo","Solberga","Tjuvkil","Ödsmål och Åseby",
"Ödsmåls mosse och Rörtången","Aröd","Timmervik","Harestad","Nereby","Signehög","Norrmannebo","Ödsmål","Åseby","Ödsmåls mosse","Rörtången"))
ALINGSÅS<-toupper(c("Alingsås","Ingared","Sollebrunn","Västra Bodarna","Gräfsnäs","Hemsjö","Stora Mellby","Hjälmared","Långared","Svanvik",
"Ryd","Magra"))
VARA<-toupper(c("Vara","Kvänum","Tråvad","Jung","Vedum","Larv","Stora Levene","Emtunga","Arentorp"))
ESSUNGA<-toupper(c("Nossebro","Främmestad","Jonslund"))
VÅRGÅRDA<-toupper(c("Vårgårda","Östadkulle","Horla"))
GRÄSTORP<-toupper(c("GRÄSTORP"))
LIDKÖPING<-toupper(c("Lidköping","Lidköping norra","Vinninga","Järpås","Filsbäck","Örslösa","Saleby"))
GÖTEBORG<-toupper(c("Göteborg","Gunnared och Hammarkullen","Torslanda","Billdal","Olofstorp","Donsö","Nolvik","Styrsö","Angered",
"Brännö","Säve","Helgered","Tumlehed","Asperö","Stenared","Vrångö","Gundal och Högås","Gunnared","Hammarkullen","Gundal","Högås"))

我试图通过mgsub (文本清洁版)将村名向量替换为市政名称,但我遇到了一些问题。例如,"strand“(一个村庄的名字)也是一个流行的后缀。这意味着"HUNNEBOSTRAND“被转换为"HUNNEBOUDDEVALLA”,这当然不是最优的。

我尝试用正则表达式来编写向量:

代码语言:javascript
复制
LYSEKIL<-toupper(c("^Lysekil$", "^Brastad$", "^Grundsund$", "^Fiskebäckskil$"))

我发现文本干净的mgsub版本无法处理正则表达式。我换到mgsub包,它希望我的向量长度相同,这不是我想要的。mgsub的qdap版本似乎以类似的方式运行。

有办法绕过这件事吗?

原始数据(删除敏感部分)

结构(城市=c(“HEN”、NA、“HEN”、“LV NGEN”、NA、“TROLLH”)、ZIPCODE =c(47395 L、NA、47332 L、44636L、NA、46157 L)、COURSEOFFERING_ID =c(97113 L、97113 L)、row.names = c(1L、5L、9L、12L、15L、18L),类= "data.frame")

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-18 08:03:49

为了避免村庄名称也是后缀的问题,您可以用^$锚定这些名称的开头和结尾(您有正确的想法)。但是,要将村庄名称替换为相应市政当局的名称,您需要使用函数gsub() (或stringr::str_replace_all())。为了安全起见,不必担心哪些名字会成为问题,只需用^$锚定所有的村庄名称。

以下是一个选择:

  1. 创建一个带有100+村庄名称的向量(我使用的是前两个向量):

代码语言:javascript
复制
all_village_names <- c(
  "Trollhättan", "Sjuntorp", "Velanda", "Åsaka", "Upphärad",  "UDDEVALLA",
  "KURVERÖD", "AMMENÄS", "FAGERHULT", "LANESUND OCH ÖVERBY", "LANESUND",
  "ÖVERBY", "RESTENÄS OCH ULVESUND", "RESTENÄS", "ULVESUND", "STRAND",
  "UTBY", "HOGSTORP", "SUND", "SMEDSERÖD"
)

  1. 使用一系列的gsub()替换它们对应的市政名称(这里,我再次使用您的前2行代码):

代码语言:javascript
复制
library(dplyr)

all_village_names %>%
  gsub("^Trollhättan$|^Sjuntorp$|^Velanda$|^Åsaka$|^Upphärad$", "TROLLHÄTTAN", .) %>%
  gsub("^UDDEVALLA$|^KURVERÖD$|^AMMENÄS$|^FAGERHULT$|^LANESUND OCH ÖVERBY$|^LANESUND$|^ÖVERBY$|^RESTENÄS OCH ULVESUND$|^RESTENÄS$|^ULVESUND$|^STRAND$|^UTBY$|^HOGSTORP$|^SUND$|^SMEDSERÖD$", "UDDEVALLA", .)

您将得到一个100+元素的向量(每个初始村庄都有一个),但是该向量将仅由22个市政名称组成。

对于我使用的示例数据,这将给您提供:

代码语言:javascript
复制
[1] "TROLLHÄTTAN" "TROLLHÄTTAN" "TROLLHÄTTAN" "TROLLHÄTTAN" "TROLLHÄTTAN"
 [6] "UDDEVALLA"   "UDDEVALLA"   "UDDEVALLA"   "UDDEVALLA"   "UDDEVALLA"  
[11] "UDDEVALLA"   "UDDEVALLA"   "UDDEVALLA"   "UDDEVALLA"   "UDDEVALLA"  
[16] "UDDEVALLA"   "UDDEVALLA"   "UDDEVALLA"   "UDDEVALLA"   "UDDEVALLA"  

在没有锚定的情况下,LANESUND被转换为LANEUDDEVALLA (因为SUND被转换为UDDEVALLA)。但锚定阻止了这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58445999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档