当前,我正在尝试将数据集分为三个部分:已开发,正在开发和未开发。削减标准是分位数。那是, 发达的将是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并一一进行。看来这工作太多了,我觉得如果要一遍遍地迭代计算机,就没有理由使用计算机了。
答案 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)
)
)
)