R Decile百分比绘图

时间:2015-07-07 19:05:28

标签: r ggplot2 statistics bigdata data-analysis

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

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

*这是一个例子,实际的观察结果超过5k

我希望能够:

  1. 仅按收入绘制十分位数分布。
  2. 创建一个变量,它只按每个Home所在的收入分配十分之一的分配。
  3. 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
    ..       ..          ..        ..
    

    谢谢!

1 个答案:

答案 0 :(得分: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)

enter image description here