R 切割数据集生成新因子变量的方法

R 切割数据集生成新因子变量的方法,r,R,目前,我正在尝试将数据集分为三个部分:已开发、正在开发和未开发。切割标准为分位数。就是, 发达国家将是75%分位数以上的国家,发展国家将在50%-75%之间,欠发达国家将在50%以下。然而,分位数因年份不同而不同 data = data.frame("country" = c("U.S.A","U.S.A","Jamaica","Jamaica","Congo","Congo"), "year" = c(2000,2001,2000,2001,2000,2001), "gdp_per_cap

目前,我正在尝试将数据集分为三个部分:已开发、正在开发和未开发。切割标准为分位数。就是, 发达国家将是75%分位数以上的国家,发展国家将在50%-75%之间,欠发达国家将在50%以下。然而,分位数因年份不同而不同

data = data.frame("country" = c("U.S.A","U.S.A","Jamaica","Jamaica","Congo","Congo"), 
"year" = c(2000,2001,2000,2001,2000,2001), 
"gdp_per_capita" = c(30000,40000,100,200,50,60))
我所做的是按年份计算分位数,我得到了一个数据框,其中只包含这些信息。现在,我正试图利用这些信息,每年应用上述标准

范例 2000 = (50% = 3000, 75% = 15999) 2001 = (50% = 5000, 75% = 18000) 切点变化

可能的结果

year country  gdp_per_capita    status
2000    U.S.      1800000      "developed"
2000    France    200000       "developed"
....more than 500+ obs.
2000   Kenya       300         "under-developed"
2000   Malaysia    1500         "developing"
2001   Malaysia    3000         "developing"
2001   Kenya       500         "under-developed"
2001   Spain       30000       "developed"
2000   India       300       "under-developed"
2001   India       5100        "developing"
解决这个问题最有效的方法是什么?
我试着用ifelse,然后一个接一个地做。这似乎是太多的工作了,如果我要逐一迭代,我觉得没有理由使用计算机。

< P>而不是<代码> Data.Frase<代码>,考虑<代码> RBION/COD> <代码> >。调用< /代码>创建分位数作为列,然后<代码>合并< /代码>到原始数据集一年。最后,使用嵌套的
ifelse
条件逻辑计算状态

### QUANTILES
quantiles_matrix <- do.call("rbind", tapply(data$gdp_per_capita, data$year, quantile))

quantiles_df <- transform(data.frame(quantiles_matrix), 
                          year = row.names(quantiles_matrix))

### MERGE
mdf <- merge(data, quantiles_df, by="year")

### STATUS COLUMN ASSIGNMENT
final_df <- transform(mdf,
  status = ifelse(gdp_per_capita > X75., "developed",
                   ifelse(gdp_per_capita >= X50. & gdp_per_capita <= X75., "developing",
                          ifelse(gdp_per_capita < X50., "under-developed", NA)
                   )
            )
)
分位数
分位数矩阵如果您包含一个简单的示例输入和所需输出,可用于测试和验证可能的解决方案,则更容易为您提供帮助。
一瞥
不算作可复制,因为我们无法将其复制/粘贴到R中。这可能是重复的:它有点不同,因为这里的分位数每年都不同。我已经看过那篇文章了,它似乎对整个数据集都取分位数,而不管类型如何。很可能你只需要一个
groupby()
mutate()
,但你提供的样本数据只有一年,相同的值反复出现,因此测试起来并不容易。我们不需要你的真实数据,只需要一些小的、能代表问题的数据。
### QUANTILES
quantiles_matrix <- do.call("rbind", tapply(data$gdp_per_capita, data$year, quantile))

quantiles_df <- transform(data.frame(quantiles_matrix), 
                          year = row.names(quantiles_matrix))

### MERGE
mdf <- merge(data, quantiles_df, by="year")

### STATUS COLUMN ASSIGNMENT
final_df <- transform(mdf,
  status = ifelse(gdp_per_capita > X75., "developed",
                   ifelse(gdp_per_capita >= X50. & gdp_per_capita <= X75., "developing",
                          ifelse(gdp_per_capita < X50., "under-developed", NA)
                   )
            )
)