如何在R中创建分位数并绘制直方图

时间:2014-04-20 13:27:38

标签: r histogram percentile quantile

我最近开始使用R.我有一个数据集,它由两列和100000行组成,如下所示:

       Y    TOTA
1      1    403500.000
2      1    188334.000
3      0    812387.000
4      0    163626.000
5      1    49527.000
6      1    48661.000
7      0    36712.000
8      1    31745.000
9      1    23342.000
10     0    46835.000
...... .    .........
100000 0    10.982

变量Y只能有两个值:0或1,而变量TOTA可以有不同的值。 功能摘要给出了以下结果:

          Y               TOTA         
  Min.   :0.0000   Min.   :       0  
  1st Qu.:0.0000   1st Qu.:     939  
  Median :1.0000   Median :    3918  
  Mean   :0.5113   Mean   :   40245  
  3rd Qu.:1.0000   3rd Qu.:   11028  
  Max.   :1.0000   Max.   :18938000  
                   NA's   :261       

目的:

我想创建一个包含10行和3列的表。每行代表我的数据集的十分位数,最后一行显示NA。现在我想填充我的表格来查看数据集。如果数据集中的第一列 1 ,则将+1添加到创建的表中,其中值与其中一列和“Number Active Companies”列的值范围匹配。如果第一个值 0 ,则在值与表值范围匹配的相应行中的“Number Passive Companies”列中添加+1。 表的每一行代表变量TOTA

的不同范围

我所尝试的内容

到目前为止,我所尝试的是创建一个包含我的数据集处理结果的表

    Number Active Companies  Number Passive Companies   Total
1   0                       0                           0
2   0                       0                           0
3   0                       0                           0
4   0                       0                           0
5   0                       0                           0
6   0                       0                           0
7   0                       0                           0
8   0                       0                           0
9   0                       0                           0
10  0                       0                           0



result<-matrix(data = 0, nrow = 10, ncol = 3, byrow = FALSE, dimnames = list(1:10,c("Number Active Companies","Number Passive Companies","Total")));   

之后我创建了10个包含不同变量范围的组:

x > 0 && x < 100
x > 100 && x < 1000
x > 1000 && x < 10000
x > 10000 && x < 100000
x > 100000 && x < 1000000
x > 1000000 && x < 1000000
x > 5938000 && x < 10938000
x > 10938000 && x < 15938000
x > 15938000 && x < 18938000
x=NA

现在我想用这种方式填充上一个表格。 我想分析Y变量的每一行,如果它是1,它应该为列号活跃公司加1,而当Y为零时,该数字属于anc的行。

    for(i in TOTA){
    if (Y=1)
          if(x > 0 && x < 100){
          }else if(x > 100 && x < 1000){
          }else if(x > 1000 && x < 10000){
          }else if(x > 10000 && x < 100000){
          }else if(x > 100000 && x < 1000000){
          }else if( x > 1000000 && x < 1000000){
          }else if( x > 1000000 && x < 1000000){
          }else if( x > 5938000 && x < 10938000){
          }else if( x > 10938000 && x < 15938000){      
          }else if( x > 15938000 && x < 18938000) {
          }else{
           //Nas
          } 
    }else if(Y=0){

          if(x > 0 && x < 100){
          }else if(x > 100 && x < 1000){
          }else if(x > 1000 && x < 10000){
          }else if(x > 10000 && x < 100000){
          }else if(x > 100000 && x < 1000000){
          }else if( x > 1000000 && x < 1000000){
          }else if( x > 1000000 && x < 1000000){
          }else if( x > 5938000 && x < 10938000){
          }else if( x > 10938000 && x < 15938000){      
          }else if( x > 15938000 && x < 18938000) {
          }else{
           //Nas
          } 
    }

问题

我怎样写在桌子上? 我怎样才能更轻松地完成这个过程? 如何创建此表的直方图?

我想知道我是否正在做正确的事情,因为我已经阅读了函数quantile()和percentile()的手册,看起来他们做了同样的事情

你能否给我一些准则和可能的命令来实现我的目标

谢谢

1 个答案:

答案 0 :(得分:1)

仍然很难弄清楚你想要完成什么,但这是我最好的猜测:

# create reproducible example - you already have this...
set.seed(1)
df <- data.frame(Y=sample(0:1,100000,replace=T),
                 TOTA=runif(100000,0,18938000))
na     <- sample(1:100000,5000)    # 5% NA
df[na,]$TOTA <- NA

# you start here...
breaks <- c(0,10^(2:6), 5938000, 10938000, 15938000, 18938000)
labels <- c("0-100","100-1000","1000-10000","10000-100000",
            "100000-100000","100000-1000000","1000000-5938000",
            "5938000-10938000","10938000-18938000","NA")
df$group <- cut(df$TOTA,breaks=breaks,labels=F)
df[is.na(df$group),]$group <- 10
df$grpLabel <- labels[df$group]

result           <- aggregate(Y~group,df,function(x)sum(x==1))
colnames(result) <- c("Group","Active")
result$Passive   <- aggregate(Y~group,df,function(x)sum(x==0))$Y
result$Group     <- labels[result$Group]
result
#                Group Active Passive
# 1              0-100      0       1
# 2           100-1000      1       2
# 3         1000-10000     29      17
# 4       10000-100000    224     212
# 5      100000-100000   2310    2288
# 6     100000-1000000  12365   12328
# 7    1000000-5938000  12508   12522
# 8   5938000-10938000  12526   12649
# 9  10938000-18938000   7485    7533
# 10                NA   2544    2456

因此,这会使用cut(...)将数据集划分为多个组,然后使用1s分别对0saggregate(...)求和,然后标记这些组。通常,您可以使用cut(...)而不使用labels=F,并直接为您的群组获取有意义的标签。这里的问题是aggregate(...)将按字母顺序排序,这不是你想要的。

另请注意,在您的问题中,您的范围为1000000 - 1000000(例如1MM至1MM)。我以为这应该是1000000 - 5938000。