0

我最近开始使用 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 添加到创建的表中,其中值与其中一个列的值范围和“活跃公司数”列相匹配。如果第一个值为0,则在值与表值范围匹配的相应行的“被动公司数量”列中添加 +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() 的手册,而且它们似乎做同样的事情

你能否给我一些指导方针,可能还有一些命令来实现我的目标

谢谢

4

1 回答 1

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(...)求和,然后对组进行标记。通常,您可以使用without并直接为您的组获取有意义的标签。这里的问题是会按字母顺序对这些进行排序,这不是您想要的。1s0saggregate(...)cut(...)labels=Faggregate(...)

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

于 2014-04-20T20:03:38.063 回答