You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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"。

修正步骤

  1. 从world.cities中筛选出真正的首都城市名称,同时保留国家信息(避免同名城市混淆)
  2. 统一原数据和首都列表的国家编码,解决国家名称表述不一致的问题
  3. 先清洗原数据中的格式错误(比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 20:04:59