Как заменить вектор регулярных выражений одним выражением? - PullRequest
0 голосов
/ 18 октября 2019

У меня есть что-то вроде более 100 разных деревень в моем материале. Чтобы мои визуализации имели смысл, мне нужно сгруппировать их в 22 муниципалитета, что-то вроде этого:

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 (textclean)версия), но я сталкиваюсь с проблемами. Например, «нить» (название деревни) также является популярным суффиксом. Это означает, что «HUNNEBOSTRAND» преобразуется в «HUNNEBOUDDEVALLA», что, конечно, не оптимально.

Вместо этого я пытаюсь записать свои векторы с помощью регулярных выражений:

LYSEKIL<-toupper(c("^Lysekil$", "^Brastad$", "^Grundsund$", "^Fiskebäckskil$"))

Я считаю, чтоtextclean версия mgsub не может обрабатывать регулярные выражения. Я переключаюсь на пакет mgsub, который хочет, чтобы мои векторы были одинаковой длины, а это не то, что я хочу. Версия mdsub для qdap, похоже, работает аналогичным образом.

Есть ли способ обойти это?

Исходные данные (с удаленными чувствительными частями)

структура (список (CITY = c ("HENÅN", NA, "HENÅN"), "ÄLVÄNGEN", NA, "TROLLHÄTTAN"), ZIPCODE = c (47395L, NA, 47332L, 44636L, NA, 46157L), COURSEOFFERING_ID = c (97113L, 97113L, 97113L, 97113L, 97113L), 9711311, 9711311, 9711311)= c (1L, 5L, 9L, 12L, 15L, 18L), класс = "data.frame")

1 Ответ

1 голос
/ 18 октября 2019

Чтобы избежать проблемы, когда название деревни также является суффиксом, вы можете привязать начало и конец этих имен с помощью ^ и $ (у вас была правильная идея). Но чтобы заменить названия деревень на названия соответствующих муниципалитетов, вам нужно использовать функцию gsub() (или stringr::str_replace_all()). Чтобы не рисковать и не беспокоиться о том, какие имена будут проблемой, просто привяжите все названия деревень с помощью ^ и $.

. Вот вариант:

  1. Создайте вектор с более чем 100 названиями деревень (я использую первые два вектора в качестве примера):
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"
)
используйте серию gsub(), чтобы заменить их соответствующими названиями муниципалитетов (здесь я снова использую ваши первые 2 строки кода):
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 названий ваших муниципалитетов.

При использовании данных выборки, которые я использовал, вы получите:

[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). Но якорь предотвращает это.

...