У меня есть 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
Что я думал:
- Порядок столбца VAR1 в порядке возрастания;
- Создать пронумерованный столбец от 1 до N (
n=_N_
) - в этом случае N = 12; - Я делаю
a=N*0.25
(чтобы получить значение, представляющее 25%); - Я делаю
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;
Большое спасибо!