如何在R中创建判断城市是否为首都的变量?代码出错排查
问题:标记事件是否发生在首都的代码返回全为"non-capital"
我有一份全球事件数据集,计划将其聚合至国家-年份级别。在此之前想要创建一个capital.city变量,用于标记事件是否发生在首都城市。通过AI生成的代码运行后,返回结果全是"non-capital",请帮忙排查问题。
原代码如下:
library(countrycode) library(maps) # Load the world cities dataset data("world.cities") # Create a list of capital cities capital_cities <- unique(world.cities$capital) # Create a new variable indicating whether a city is a capital or not dt_protest$capital_city <- ifelse(dt_protest$city %in% capital_cities, "capital", "non-capital")
数据样本:
date month year city country 4/4/2006 4 2006 Lyon France 5/23/2021 5 2021 Abeokuta Nigeria 3/19/1996 3 1996 Kuala Lumpur Malaysia 11/30/2006 11 2006 Moscow Russia 11/30/2011 11 2011 Tinsukia India 1/4/2014 1 2014 Saharsa India 11/23/2016 11 2016 Venezuela Cuba 9/27/2019 9 2019 Shanghai China 5/22/2003 5 2003 Bonn Germany 12/7/2006 12 2006 Thetford United Kingdom 9/10/2010 9 2010 New Delhi India 11/17/2020 11 2020 Helsinki Finland 1/22/2011 1 2011 Berlin Germany 3/19/1993 3 1993 Jerusalem Israel 8/2/2004 8 2004 Mumbai India 12/9/2000 12 2000 Mumbai India 8/29/2001 8 2001 Guelph Canada 4/7/2003 4 2003 Seoul South Korea 9/11/2003 9 2003 Brussels Belgium 4/5/2006 4 2006 Hong Kong China 2/1/2007 2 2007 Kathmandu Nepal 10/4/2007 10 2007 Moscow Russia 9/3/2008 9 2008 Luanda Angola 10/21/2009 10 2009 JohannesburgSouth Africa 2/20/2010 2 2010 TashkentUzbekistan 7/20/2010 7 2010 Singur India 10/24/2011 10 2011 SrinagarIndia 11/14/2012 11 2012 Delhi India 1/2/2015 1 2015 Cairo Egypt 10/13/2015 10 2015 TinsukiaIndia
问题原因与修正方案
核心错误
原代码中world.cities$capital并不是城市名称,而是一个数值标记:1代表正式首都,2代表行政首都,0代表非首都。拿这个数值列表和数据集里的城市名称做匹配,完全没有对应关系,所以所有结果都返回"non-capital"。
修正步骤
- 从
world.cities中筛选出真正的首都城市名称,同时保留国家信息(避免同名城市混淆) - 统一原数据和首都列表的国家编码,解决国家名称表述不一致的问题
- 先清洗原数据中的格式错误(比如
JohannesburgSouth Africa这类城市和国家未分隔的情况)
修正后的代码
library(countrycode) library(maps) # 加载世界城市数据 data("world.cities") # 筛选所有首都城市(包含正式首都和行政首都) capital_cities <- world.cities[world.cities$capital %in% c(1, 2), c("name", "country.etc")] # 统一国家编码,消除名称表述差异 dt_protest$iso3 <- countrycode(dt_protest$country, origin = "country.name", destination = "iso3c") capital_cities$iso3 <- countrycode(capital_cities$country.etc, origin = "country.name", destination = "iso3c") # 基于城市名称+国家编码的精准匹配,生成capital_city变量 dt_protest$capital_city <- ifelse( paste(dt_protest$city, dt_protest$iso3) %in% paste(capital_cities$name, capital_cities$iso3), "capital", "non-capital" )
额外说明
- 原数据中存在格式错误(如
JohannesburgSouth Africa、TashkentUzbekistan),需要先将城市和国家字段拆分,否则这些行的匹配会失败 - 对于德国Bonn这类曾经的行政首都,若需要标记历史时期的首都状态,可以调整
capital_cities的筛选逻辑,或结合事件年份做进一步判断
内容的提问来源于stack exchange,提问作者Ferenc
相关产品推荐
相关产品推荐

