Как изменить содержимое столбца в data.frame - PullRequest
0 голосов
/ 11 января 2012

Я использую данные из индикаторов мирового развития (WDI) и хочу объединить эти данные с некоторыми другими данными. Моя проблема в том, что написание названий стран в двух наборах данных отличается. Как изменить переменную страны?

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

Как мне изменить ArabWorld на Arab World?

Есть много имен, которые мне нужно изменить, так что выполнение этого с использованием row.numbers не даст мне достаточной гибкости. Я хочу что-то похожее на функцию replace в Stata.

Ответы [ 3 ]

5 голосов
/ 11 января 2012

Это будет работать для персонажа или факторов.

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

Это эквивалентно:

> 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

Если вы создаете фрейм данных с желаемыми изменениями, вы можете перейти к ним, чтобы изменить их. Обратите внимание, что я обновил это, чтобы оно показало, как вводить скобки в этом столбце, чтобы они правильно передавались в 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) }
1 голос
/ 11 января 2012

Самое простое, особенно если вам нужно изменить много имен, - это, вероятно, поместить вашу таблицу соответствий в data.frame и объединить ее с данными командой merge. Например, если вы хотите изменить название Кореи:

# 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"), ])

Однако может быть безопаснее объединить два набора данных в коде ISO страны, который является более стандартным, чем в названии страны.

0 голосов
/ 11 января 2012

Использование поднабора:

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
...