如何在R中创建一个变量来表示一个城市是否是首都?

0dxa2lsx  于 2023-04-27  发布在  其他
关注(0)|答案(1)|浏览(96)

我有一个数据集,其中包含世界各地发生的事件的信息。我的目的是将这些数据汇总到国家/地区的年度水平。但在此之前,我想创建一个变量“capital.city”,表明事件是否发生在首都城市。
到目前为止,我所做的-咨询AI Bing -是这样的:

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
ozxc1zmp

ozxc1zmp1#

Bing的人工智能建议capital_cities <- unique(world.cities$capital)并没有创建一个首都城市的列表(惊喜,人工智能让你误入歧途!)-它创建了一个长度为4的整数向量(c(0, 1, 3, 2)),这是该列的唯一值,并且不采用任何城市名称。
您将获得所有非大写值,因为city值永远不会采用0、1、2或3的值,因此默认为ifelse的“else”方面,即“not capital”。
如果只是使用城市作为指标,你应该这样做:

capitals <- unique(world.cities[world.cities$capital > 0, "name"])

然后你可以使用ab ifelse语句来创建新的变量:

df <- data.frame(country = c("China", "China", "Serbia", "Serbia", "Germany", "Germany"),
                 city = c("Beibei", "Beijing", "Bavaniste", "Belgrade", "Bayreuth" ,"Berlin"))

capitals <- unique(world.cities[world.cities$capital > 0, "name"])

df["capital"] <- ifelse(df$city %in% capitals, 
                        "capital", 
                        "not capital")

但是,如果两个国家都有一个城市,其中一个是首都,另一个不是首都,这可能会导致问题。法国巴黎和美国印第安纳州州巴黎是非常不同的地方。一个“更安全”的方法可能是在城市和国家都使用merge

capitals <- unique(world.cities[world.cities$capital > 0, c("name", "country.etc", "capital")])

capdat <- merge(df, capitals,
  by.x = c("country", "city"),
  by.y = c("country.etc", "name"),
  all.x = TRUE)

capdat$capital <- ifelse(!is.na(capdat$capital), "capital", "not capital")

在这些数据中,输出都是:

country      city     capital
1   China    Beibei not capital
2   China   Beijing     capital
3  Serbia Bavaniste not capital
4  Serbia  Belgrade     capital
5 Germany  Bayreuth not capital
6 Germany    Berlin     capital

请注意,world.cities数据集表示中国的其他行政首都为2(直辖市)或3(省会)-请参见?world.cities。如果您不想包括这些,请更改为unique(world.cities[world.cities$capital == 1, "name"])

相关问题