Создать интервалы равной ширины между минимумом и максимумом переменной
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | * Проранжировать значения переменной var1 номерами заданного числа интервалов равной ширины между минимальным и максимальным значением переменной var1. * (Код не тестировался на отрицательных значениях минимума). * Автор: rlevesque@videotron.ca. DATA LIST FREE /var1(F8). BEGIN DATA. 0 15 31 91 17 24 29 98 57 90 6 7 100 24 74 21 END DATA. LIST. COMPUTE dummy=1. AGGREGATE /OUTFILE='min_max.SAV' /BREAK=dummy /var1_min = MIN(var1) /var1_max = MAX(var1). MATCH FILES /FILE=* /TABLE='min_max.SAV' /BY dummy. *Допустим, желаем разбить значения на 8 интервалов. COMPUTE #delta=(var1_max - var1_min)/8. COMPUTE inter=MIN(TRUNC(var1/#delta)+1,8). EXECUTE. *Краткая техническая справка: *Интервалы закрыты слева. *inter=1 - когда var1 в интервале [var1_min, var1_min + 1*#delta) *inter=2 - когда var1 в интервале [var1_min+1*delta, var1_min + 2*#delta) *... *inter=8 - когда var1 в интервале [var1_min+7*delta, var1_min + 8*#delta) *inter=9 - когда var1= var1_max. * Сложная запись последней инструкции COMPUTE обусловлена потребностью поместить значения var1=var1_max * в 8-й интервал. Другими словами, последний (8-й) интервал должен получиться закрытым и справа тоже: * [var1_min+7*delta, var1_min + 8*#delta]. * Без подобных поправок можно было бы обойтись, выбрав #delta следующим образом: COMPUTE #delta=1.000001*(var1_max - var1_min)/8. * Хотя это, конечно, и не идеальное решение. |
Related pages
...