将变量聚合到新变量

时间:2015-09-19 05:42:21

标签: r

我在数据框中有一个列,其中包含30个不同的国家/地区。我想将这些国家分为5个新值。

例如,

我有

China
Japan
US
Canada
 ....

汇总到新变量:

Asia 
Asia
North America
North America
 ....

我正在考虑的一个解决方案是使用嵌套的ifelse。然而,似乎我需要4或5个嵌套的ifelse来获得我需要的东西。我认为这不是一个好方法。我想知道其他有效的解决方案。

5 个答案:

答案 0 :(得分:5)

一种选择是使用键/值数据集。来自countrycode_data的{​​{1}}可用于此目的。我们将'countrycode_data'中的'country.name'列与示例数据列('Col1')相匹配。如果没有匹配项,则会返回library(countrycode)。使用OP的示例,'US'返回NA,因为'country.name'是'United States'。但是,我们可以使用'cowc'列获得缩写形式。但是,缩写版本也是NA,我们可以使用USA找到它。我建议'{1}}'indx'中的所有grep元素。 'indx'可用于从'countrycode_data'返回'region'。

grep

注意:这将比一般的“亚洲”更具体。

如果我们使用'continent'列,

NA

数据

library(countrycode)
indx <- match(df1$Col1, countrycode_data$country.name)
pat <- paste0('^',paste(df1$Col1[is.na(indx)], collapse='|'))
indx[is.na(indx)] <- grep(pat, countrycode_data$cowc)
countrycode_data$region[indx]
#[1] "Eastern Asia"     "Eastern Asia"     "Northern America" "Northern America"

答案 1 :(得分:2)

另一种方法是使用recode包中的car函数:

library(car)
dat$Region <- recode(dat$Country, "c('China', 'Japan') = 'Asia'; c('US','Canada') = 'North America'")

  Country        Region
1   China          Asia
2   Japan          Asia
3      US North America
4  Canada North America

答案 2 :(得分:0)

它们只有30个国家/地区,因此您可以制作一些如下所示的向量,创建一个新列并根据向量进行替换。

asia <- c("India", "china")
NorthAmerica <- c("US", "canada")
df$continent <- df$countries
df$continent <- with(df, replace(continent, countries%in%asia,"Asia"))
df$continent <- with(df, replace(continent, countries%in%NorthAmerica,"North America"))

答案 3 :(得分:0)

&#39;大陆&#39;是countrycode package的内置目标代码。您可以传递国家/地区名称的向量,并使用...来获取大陆名称的向量。

library(countrycode)
countries <- c('China', 'Japan', 'US', 'Canada')
countrycode(countries, 'country.name', 'continent')

...返回

[1] "Asia"     "Asia"     "Americas" "Americas"

答案 4 :(得分:0)

请确保在使用Veera和Jay的方法将列定义为矢量时可以更改列的级别:

df$continent <- as.factor(as.vector(df$countries))