基于WEALTH分位数匹配对应INCOME的R语言技术问题
问题解决:匹配WEALTH分位数对应的INCOME值
为什么你的代码结果不符合预期?
你的核心问题是混淆了**数量分位(ntile)和数值分位(quantile)**的逻辑:
ntile(df$WEALTH, 100)是把数据强制分成100个等数量的组,每个组的观测数尽可能平均,完全不考虑WEALTH的数值分布;而quantile()计算的是数值阈值,保证指定比例的观测值小于等于该阈值。- 后续取每个ntile组的
max(INCOME),得到的是该数量分组里的最高收入,和你要的「WEALTH处于指定分位数的家庭的INCOME」不是同一个概念。
正确的实现方法
方法1:直接提取对应WEALTH分位数阈值的INCOME
先计算WEALTH的分位数阈值,再找到匹配该阈值的家庭的INCOME:
# 计算指定的WEALTH分位数阈值 wealth_quants <- quantile(df$WEALTH, probs = c(0.01, 0.05, 0.1, 0.25, 0.5, 0.75, 0.9, 0.95, 0.99)) # 提取每个阈值对应的INCOME(若有多个家庭WEALTH等于阈值,这里取第一个,可按需调整) income_matched <- sapply(wealth_quants, function(q) { df$INCOME[df$WEALTH == q][1] }) # 输出结果 income_matched
方法2:按分位数位置提取排序后的INCOME
如果需要对应分位数位置的观测(比如第1%位置的家庭),可以先按WEALTH排序,再提取对应位置的INCOME:
# 按WEALTH升序排序数据 df_sorted <- df[order(df$WEALTH), ] # 计算每个分位数对应的观测位置(ceiling向上取整,也可按需用floor) pos <- ceiling(nrow(df_sorted) * c(0.01, 0.05, 0.1, 0.25, 0.5, 0.75, 0.9, 0.95, 0.99)) # 提取对应位置的INCOME并命名 income_at_pos <- df_sorted$INCOME[pos] names(income_at_pos) <- names(wealth_quants) # 输出结果 income_at_pos
方法3:按分位数区间统计INCOME
如果需要每个分位数区间内的INCOME统计值(比如中位数、均值),可以用cut按分位数阈值分组:
# 用WEALTH分位数创建区间分组 df$wealth_quant_group <- cut(df$WEALTH, breaks = c(-Inf, wealth_quants, Inf), labels = names(wealth_quants)) # 分组统计INCOME(这里用中位数,可替换为mean/max等) income_stats <- df %>% group_by(wealth_quant_group) %>% summarise(median_income = median(INCOME), avg_income = mean(INCOME), max_income = max(INCOME)) # 输出结果 income_stats
内容的提问来源于stack exchange,提问作者Jakob
相关产品推荐
相关产品推荐

