Pregunta

Estoy utilizando datos de los indicadores de desarrollo mundial (WDI) y quiero fusionar estos datos con otros datos. Mi problema es que la ortografía de los nombres de los países en los dos conjuntos de datos es diferente. ¿Cómo cambio la variable del país?

library('WDI')
df <- WDI(country="all", indicator= c("NY.GDP.MKTP.CD", "EN.ATM.CO2E.KD.GD", 'SE.TER.ENRR'), start=1998, end=2011, extra=FALSE)

head(df)
      country iso2c year NY.GDP.MKTP.CD EN.ATM.CO2E.KD.GD SE.TER.ENRR
99  ArabWorld    1A 1998   575369488074          1.365953          NA
100 ArabWorld    1A 1999   627550544566          1.355583    19.54259
101 ArabWorld    1A 2000   723111925659          1.476619          NA
102 ArabWorld    1A 2001   703688747656          1.412750          NA
103 ArabWorld    1A 2002   713021728054          1.413733          NA
104 ArabWorld    1A 2003   803017236111          1.469197          NA

¿Cómo cambio Arabworld al mundo árabe?

Hay muchos nombres que necesito cambiar, por lo que hacer esto con el uso de la fila. Los numerosos no me darán suficiente flexibilidad. Quiero algo similar al replace Función en STATA.

¿Fue útil?

Solución

Esto funcionaría para carácter o factores.

df$country <- sub("ArabWorld", "Arab World", df$country)

Esto es equivalente:

> df[,1] <- sub("ArabWorld", "Arab World", df[,1] )
> head(df)
       country iso2c year NY.GDP.MKTP.CD EN.ATM.CO2E.KD.GD
99  Arab World    1A 1998   575369488074          1.365953
100 Arab World    1A 1999   627550544566          1.355583
101 Arab World    1A 2000   723111925659          1.476619
102 Arab World    1A 2001   703688747656          1.412750

Si crea un marco de datos con los cambios deseados, puede recorrerlos para cambiarlos. Tenga en cuenta que he actualizado esto para que muestre cómo ingresar a los paréntesis en esa columna para que se pasen correctamente a sub:

name.cng <- data.frame(orig = c("AntiguaandBarbuda", "AmericanSamoa", 
                                    "EastAsia&Pacific\\(developingonly\\)",
                                    "Europe&CentralAsia\\(developingonly\\)", 
                                    "UnitedArabEmirates"), 
                           spaced=c("Antigua and Barbuda", "American Samoa",
                                    "East Asia & Pacific (developing only)",
                                     "Europe&CentralAsia (developing only)", 
                                      "United Arab Emirates") )
for (i in 1:NROW(name.cng)){ 
      df$country <- sub(name.cng[i,1], name.cng[i,2], df$country) }

Otros consejos

Lo más fácil, especialmente si tiene muchos nombres para cambiar, es probablemente poner su tabla de correspondencia en un data.frame, y únase a él con los datos, con el merge dominio. Por ejemplo, si desea cambiar el nombre de las Coreas:

# Correspondance table
countries <- data.frame(
  iso2c = c("KR", "KP"),
  country = c("South Korea", "North Korea")
)

# Join the data.frames
d <- merge( df, countries, by="iso2c", all.x=TRUE )
# Compute the new country name
d$country <- ifelse(is.na(d$country.y), as.character(d$country.x), as.character(d$country.y))
# Remove the columns we no longer need
d <- d[, setdiff(names(d), c("country.x", "country.y"))]

# Check that the result looks correct
head(d)
head(d[ d$iso2c %in% c("KR", "KP"), ])

Sin embargo, puede ser más seguro unirse a sus dos conjuntos de datos en el código ISO del país, que es más estándar que en el nombre del país.

Uso de subsecientes:

df[df[, "country"] == "ArabWorld", "country"] <- "Arab World"

head(df)
   country iso2c year NY.GDP.MKTP.CD EN.ATM.CO2E.KD.GD SE.TER.ENRR
99  Arab World    1A 1998   575369488074          1.365953          NA
100 Arab World    1A 1999   627550544566          1.355583    19.54259
101 Arab World    1A 2000   723111925659          1.476619          NA
102 Arab World    1A 2001   703688747656          1.412750          NA
103 Arab World    1A 2002   713021728054          1.413733          NA
104 Arab World    1A 2003   803017236111          1.469197          NA
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top