¿Cómo cambio el contenido de una columna en Data.Frame
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.
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