Как выбрать процент значений из столбца в SAS? - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть 70 баз данных разных размеров (одинаковое количество столбцов, разное количество строк). Мне нужно получить на 25% более высокие значения и на 25% более низкие значения с учетом заданного столбца VAR1.

У меня есть:

id VAR1
1    10
2    -5
3   -12
4     7
5    12
6     7
7    -9
8   -24
9     0
10    6
11  -18
12   22

Сортировка по VAR1, мне нужно выбрать строки ( все столбцы), содержащие 3 самых маленьких и 3 самых больших (25% от каждого крайнего значения), т. е.

id  VAR1
8   -24
11  -18
3   -12
7   -9
2   -5
9   0
10  6
4   7
6   7
1   10
5   12
12  22

Мне нужно keep в базе данных строк (все столбцы), которые содержат VAR1 равно -24, -18, -12, 10, 12 и 22.

id  VAR1
8   -24
11  -18
3   -12
1   10
5   12
12  22

Что я думал:

  1. Порядок столбца VAR1 в порядке возрастания;
  2. Создать пронумерованный столбец от 1 до N (n=_N_) - в этом случае N = 12;
  3. Я делаю a=N*0.25 (чтобы получить значение, представляющее 25%);
  4. Я делаю b=N-a (чтобы получить значение, которое представляет "последние" 25%).

Итак, я могу использовать keep: if N<a ... У меня будут первые 25% (самые маленькие). if N>b .... У меня будут последние 25% (самые большие).

Я могу рассчитать a и b. Но я не получаю максимальное значение N в этом случае 12.

Я повторю это для базы данных 70, я не хотел бы вводить это максимальное значение каждый раз (оно варьируется от одна база данных в другую).

Мне нужна помощь, чтобы «зафиксировать» максимальное значение (N) без необходимости его ввода (даже если оно повторяется во всех строках другого «вспомогательного столбца»). Или, если есть какой-то лучший способ получить эти 25% с каждого конца.

Мой код:

proc sort data=have; by VAR1; run;
data want; set have;
seq=_N_;
N=max(seq); *N=max. value of lines. (I stopped here and don’t know if below is right);
a=N*0.25;
b=N-b;
if N<a;
if N>b;
run;

Большое спасибо!

1 Ответ

0 голосов
/ 03 апреля 2020

Proc RANK вычисляет процентили, которые можно использовать для выбора нужных строк.

Пример:

data have1 have2 have3 have4 have5;
  do id = 1 to 100;
    X = ceil(rand('normal', 0, 10));
    if id < 60 then output have1;
    if id < 70 then output have2;
    if id < 80 then output have3;
    if id < 90 then output have4;
    if id < 100 then output have5;
  end;
run;

proc rank data=have1 percent out=want1(where=(pct not between 25 and 75)) ;
  var x;
  ranks pct;
run;

proc rank data=have2 percent out=want2(where=(pct not between 25 and 75)) ;
  var x;
  ranks pct;
run;

proc rank data=have3 percent out=want3(where=(pct not between 25 and 75)) ;
  var x;
  ranks pct;
run;

...