切割数据集以制作新因子变量的方法

时间:2019-04-29 21:37:15

标签: 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_capita" = c(30000,40000,100,200,50,60))
quantiles = do.call("data.frame", 
tapply(data$gdp_per_capita, data$year, quantile))

我要做的是按年计算分位数,我得到了一个仅包含该信息的数据框。现在,我正在尝试使用此信息来每年应用以上标准。

示例 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并一一进行。看来这工作太多了,我觉得如果要一遍遍地迭代计算机,就没有理由使用计算机了。

1 个答案:

答案 0 :(得分:1)

考虑使用data.frame中的rbind而不是do.call来创建分位数百分比作为列,然后按 year merge创建到原始数据集。最后,使用嵌套的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)
                   )
            )
)

Rextester demo