Как создать квантили в R и построить гистограмму

Недавно я начал работать с R. У меня есть набор данных, состоящий из двух столбцов и 100 000 строк, как показано ниже:

       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 равно нулю.

    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() и centile(), и кажется, что они делают одно и то же.

Не могли бы вы дать мне несколько рекомендаций и, возможно, несколько команд для достижения моей цели?

Спасибо


person QGA    schedule 20.04.2014    source источник
comment
Я не уверен, что понимаю, но посмотрите, поможет ли что-то вроде table(cut(dataset$TOTA[dataset$Y == 0], c(0, 100, 1000, ...))). (и второй раз с Y == 1)   -  person alexis_laz    schedule 20.04.2014
comment
Ваш код опасно близок к тому, чтобы претендовать на thedailywtf.com :-( . Каждый раз, когда у вас есть более двух else, практически гарантировано, что есть гораздо лучший способ сортировки или разделения наборов данных. Здесь я мог бы рассмотреть hist(log(data))   -  person Carl Witthoft    schedule 20.04.2014
comment
Вы говорите, что вам нужны децили вашего набора данных, но предлагаемые вами разрывы (0,100,1000,...) этого не сделают. Так что это? Вам нужны эти перерывы или вам нужны децили?   -  person jlhoward    schedule 20.04.2014
comment
@CarlWitthoft Спасибо, Карл! Да, это примерно то, о чем я думал. Я уверен, что есть более простой способ сделать это   -  person QGA    schedule 20.04.2014
comment
@jlhoward Спасибо! Я хотел бы разбить значения набора данных на 10 групп. Я создал этот алгоритм, потому что не знаю, как разделить свой набор данных в R и присвоить каждому значению разные категории. В дополнение к моим категориям есть еще одна дополнительная группа для NA (отсутствующие значения).   -  person QGA    schedule 20.04.2014


Ответы (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 и 0s отдельно, используя aggregate(...), а затем помечает группы. Обычно вы можете использовать cut(...) без labels=F и напрямую получать значимые метки для своих групп. Проблема здесь в том, что aggregate(...) будет сортировать их в алфавитном порядке, а это не то, что вам нужно.

Также обратите внимание, что в вашем вопросе указан диапазон от 1000000 до 1000000 (например, от 1 до 1 мм). Я предположил, что это должно быть 1000000 - 5938000.

person jlhoward    schedule 20.04.2014