R十分位百分比绘图

Posted

技术标签:

【中文标题】R十分位百分比绘图【英文标题】:R Decile percentage plotting 【发布时间】:2015-07-07 19:05:28 【问题描述】:

我有一个来自家庭收入民意调查的数据框,如下所示:

ID       Income      Expense
001      2389.9      1400.5
003      5499.3      2309.2
..       ..          ..

*这是一个例子,实际有超过 5k 次观察

我希望能够:

    仅按收入绘制十分位数分布。 创建一个变量,仅分配每个家庭所在的收入分配的十分之一。

1) 我已经尝试过了,但这不是我想要的,我想知道每十分之一中的房屋百分比:

> Deciles<-quantile(DF$Income, prob = seq(0, 1, length = 11), type = 5)
> Deciles
        0%        10%        20%        30%        40%        50%        60% 
    231.89    9024.48   13308.24   16945.15   21071.38   25661.58   31607.07 
       70%        80%        90%       100% 
  40360.98   52927.98   77926.47 1634433.60 

2) 对于第二部分,我希望得到这样的东西:

ID       Income      Expense   Decile
001      2389.9      1400.5    3
003      5499.3      2309.2    5
009      2245.0      1789.2    3
..       ..          ..        ..

谢谢!

【问题讨论】:

试试as.integer 你的十分位数 当你说“我已经尝试过了,但这不是我想要的:”,你应该解释为什么这不是你想要的 - 它与你想要的有什么不同输出? @nrussell 谢谢!我想要两个知道的是每十分之一的房屋数量 每十分之一的房屋比例不总是10%吗? 【参考方案1】:

我想你是在问是否有一个函数是分位数的倒数,按比例缩放和上限以返回分布中每个观察值的十分位数 (1-10)。您可以使用ecdf,也可以自己编写。我的看起来像这样:

# using my convention, decile 1 is highest value.  Swap -x for x if you want to change it
get_decile <- function(x) ceiling(10*rank(-x, ties.method="random") / length(x))

你可以用十分位数来绘制平均收入:

# reproducible example!
your_df <- data.frame(id=1:1e3,
                      income=rnorm(1e3,5e4,2e4), 
                      expense=rnorm(1e3, 3e4, 1e4))

your_df$income_decile <- get_decile(your_df$income)

library(ggplot2)
ggplot(your_df, aes(x=income_decile, y=income)) + 
    stat_summary(fun.y=mean, geom="line") +
     scale_x_reverse(breaks=1:10)

【讨论】:

为什么不使用ntile()?这也是一种分法,不是吗? @l_m_ ntile() 是什么? R中用于deciling的函数

以上是关于R十分位百分比绘图的主要内容,如果未能解决你的问题,请参考以下文章

百分位,百分位数(percentile)

生存分析R语言绘图——ggsuvplot介绍及实例

如何为 R 中使用百分比而不是计数作为 y 轴的数据框创建条形图?

ggplot:绘图标题和绘图相互重叠

tableau高级绘图-tableau绘制辐射堆叠图

tableau高级绘图-tableau绘制辐射堆叠图