извлечение названия страны из названия города в R

Этот вопрос может выглядеть как дубликат, но я столкнулся с некоторой проблемой при извлечении названий стран из строки. Я прошел по этой ссылке [ссылка] Извлечение названия страны из сведений об авторах, но Я не смог решить свою проблему. Я пробовал grepl и цикл for для сопоставления и замены текста, мой столбец данных состоит из более чем 300 тыс. строк, поэтому использование цикла grepl и for для сопоставления с образцом происходит очень-очень медленно.

У меня есть такая колонка.

org_loc

Zug
Zug  Canton of Zug
Zimbabwe
Zigong
Zhuhai
Zaragoza 
York  United Kingdom
Delhi
Yalleroi  Queensland
Waterloo  Ontario
Waterloo  ON 
Washington  D.C.
Washington D.C. Metro 
New York


df$org_loc <- c("zug", "zug  canton of zug", "zimbabwe", 
"zigong", "zhuhai", "zaragoza","York  United Kingdom", "Delhi","Yalleroi  Queensland","Waterloo  Ontario","Waterloo  ON","Washington  D.C.","Washington D.C. Metro","New York")

строка может содержать название штата, города или страны. Я просто хочу Country в качестве вывода. Нравится

org_loc

Switzerland
Switzerland
Zimbabwe
China
China
Spain
United Kingdom
India
Australia
Canada
Canada
United State
United state
United state

Я пытаюсь преобразовать состояние (если совпадение найдено) в его страну, используя библиотеку кодов стран, но не могу этого сделать. Любая помощь будет ценной.


person girijesh96    schedule 22.03.2018    source источник


Ответы (3)


library(countrycode)
df <- c("zug  switzerland", "zug  canton of zug  switzerland", "zimbabwe", 
            "zigong  chengdu  pr china", "zhuhai  guangdong  china", "zaragoza","York  United Kingdom", "Yamunanagar","Yalleroi  Queensland  Australia","Waterloo  Ontario","Waterloo  ON","Washington  D.C.","Washington D.C. Metro","USA")
df1 <- countrycode(df, 'country.name', 'country.name')

Это не соответствовало многим из них, но это должно делать то, что вы ищете, основываясь на справочном руководстве для countrycode.

person Anonymous coward    schedule 22.03.2018
comment
Я также использовал тот же код для страны, но я хочу, чтобы название страны соответствовало городу. например, для Лондона я хочу Великобританию - person girijesh96; 22.03.2018
comment
world.cities библиотеки map могут помочь. См. этот вопрос SO. - person Anonymous coward; 22.03.2018

С функцией геокодирования из пакета ggmap вы можете выполнить с хорошей, но не абсолютной точностью свою задачу; вы также должны использовать свой критерий, чтобы сказать, что «Сарагоса» — это город в Испании (именно это возвращает геокод), а не где-то в Аргентине; геокод имеет тенденцию давать вам самый большой город, когда есть несколько омонимов. (удалите $country, чтобы увидеть все выходные данные)

library(ggmap)
org_loc <- c("zug", "zug  canton of zug", "zimbabwe", 
                "zigong", "zhuhai", "zaragoza","York  United Kingdom", 
             "Delhi","Yalleroi  Queensland","Waterloo  Ontario","Waterloo  ON","Washington  D.C.","Washington D.C. Metro","New York")
    geocode(org_loc, output = "more")$country

поскольку геокод предоставляется Google, у него есть ограничение на количество запросов, 2500 в день на IP-адрес; если он возвращает NA, это может быть из-за несогласованной проверки лимита, просто попробуйте еще раз.

person Elio Diaz    schedule 22.03.2018
comment
Я немного отредактировал вопрос. У меня есть название страны, но я хочу название страны для города. Можете ли вы найти его - person girijesh96; 22.03.2018
comment
спасибо за вашу помощь, он работает неоптимально, но у меня почти 300 тысяч таких значений. Я хотел бы спросить одну вещь, можем ли мы сделать это с парой ключ-значение, если у нас есть csv всего города и их страны. Вот [ссылка] github.com/girijesh18/dataset файла csv и файла примера. Я попытался сопоставить оба файла с помощью цикла for и функции grepl, но это приводит к перезаписи значений. Можете ли вы помочь мне в создании решения для сопоставления города и страны с использованием обоих CSV-файлов? - person girijesh96; 22.03.2018
comment
вы можете просто объединить ваши данные и ваш целевой csv с помощью paste(city, country), что даст сарагосу в одном столбце, а затем dplyr::left_join(); это очень быстро с совпадающими записями, которые полностью совпадают. В вашем CSV нет всех городов мира - person Elio Diaz; 22.03.2018
comment
city_and_province_list содержит все названия городов, присутствующие в этом [link]github.com/girijesh18/dataset. но как применить его с помощью левого соединения. можешь вкратце рассказать об этом - person girijesh96; 23.03.2018

Вы можете использовать свой City_and_province_list.csv в качестве пользовательского словаря для countrycode. Пользовательский словарь не может иметь дубликатов в исходном векторе (столбец City в вашем City_and_province_list.csv), поэтому вам придется сначала удалить их или как-то с ними справиться (как в моем примере ниже). В настоящее время у вас нет всех возможных строк в вашем примере в CSV-файле поиска, поэтому они не все преобразованы, но если вы добавите все возможные строки в CSV, это будет работать полностью.

library(countrycode)

org_loc <- c("Zug", "Zug  Canton of Zug", "Zimbabwe", "Zigong", "Zhuhai",
             "Zaragoza", "York  United Kingdom", "Delhi",
             "Yalleroi  Queensland", "Waterloo  Ontario", "Waterloo  ON",
             "Washington  D.C.", "Washington D.C. Metro", "New York")
df <- data.frame(org_loc)

city_country <- read.csv("https://raw.githubusercontent.com/girijesh18/dataset/master/City_and_province_list.csv")

# custom_dict for countrycode cannot have duplicate origin codes
city_country <- city_country[!duplicated(city_country$City), ]

df$country <- countrycode(df$org_loc, "City", "Country", 
                          custom_dict = city_country)

df
# org_loc                  country
# 1                    Zug              Switzerland
# 2     Zug  Canton of Zug                     <NA>
# 3               Zimbabwe                     <NA>
# 4                 Zigong                    China
# 5                 Zhuhai                    China
# 6               Zaragoza                    Spain
# 7   York  United Kingdom                     <NA>
# 8                  Delhi                    India
# 9   Yalleroi  Queensland                     <NA>
# 10     Waterloo  Ontario                     <NA>
# 11          Waterloo  ON                     <NA>
# 12      Washington  D.C.                     <NA>
# 13 Washington D.C. Metro                     <NA>
# 14              New York United States of America
person CJ Yetman    schedule 26.03.2018
comment
Благодарю за ваш ответ. Я могу получить этот ответ, используя функцию сопоставления в том же CSV, но я хотел бы обратить ваше внимание на то, что если мне нужно ввести текстовую строку, например, Вашингтон, округ Колумбия, Ватерлоо, ОН, Яллерой, Квинсленд. Метро, ​​чем это дает NA. Как я могу решить эту проблему, используя библиотеку кодов стран - person girijesh96; 27.03.2018
comment
Если бы у вас была строка Washington D.C, Waterloo ON, Yalleroi Queensland, во что бы вы ожидали, что countrycode ее преобразует? - person CJ Yetman; 27.03.2018
comment
Если вы хотите, чтобы Yalleroi Queensland был преобразован в Австралию, вы должны добавить Yalleroi Queensland к вашему City_and_province_list.csv в столбце org_loc с Австралией в столбце country в той же строке. - person CJ Yetman; 27.03.2018
comment
хорошо, спасибо за ваш ответ, но я думаю, что это будет громоздкий процесс, чтобы добавить все это в City_and_province_list.csv, потому что мой исходный набор данных имеет большое количество таких вариантов имен. - person girijesh96; 28.03.2018
comment
Таким образом, ваш вопрос заключается не в том, как это сделать, а в том, где найти готовый набор данных со всеми вашими данными? Я не могу помочь с этим. - person CJ Yetman; 28.03.2018