如何 select SAS 列中值的百分比?
How to select a percentage of values from a column in SAS?
我有 70 个不同大小的数据库(相同的列数,不同的行数)。
考虑到给定的 VAR1 列,我需要获得高 25% 的值和低 25% 的值。
我有:
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 排序,我需要 select 包含 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
(得到代表"last" 25%的值)。
所以,我可以使用 keep
:
if N<a
.....我要前25%(最小的)。
if N>b
.....我要最后的25%(最大的)。
我可以计算a
和b
。
但是在这种情况下,我没有得到 N
的最大值 12.
我将对 70 数据库重复此操作,我不想每次都必须输入这个最大值(它因数据库而异)。
我需要帮助 "fix" 最大值 (N) 而无需键入它(即使它在另一个 "auxiliary column" 的所有行中重复)。
或者如果有更好的方法从每一端获得这 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;
非常感谢!
Proc RANK
计算可用于 select 所需行的百分位数。
示例:
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;
我有 70 个不同大小的数据库(相同的列数,不同的行数)。 考虑到给定的 VAR1 列,我需要获得高 25% 的值和低 25% 的值。
我有:
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 排序,我需要 select 包含 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
(得到代表"last" 25%的值)。
所以,我可以使用 keep
:
if N<a
.....我要前25%(最小的)。
if N>b
.....我要最后的25%(最大的)。
我可以计算a
和b
。
但是在这种情况下,我没有得到 N
的最大值 12.
我将对 70 数据库重复此操作,我不想每次都必须输入这个最大值(它因数据库而异)。
我需要帮助 "fix" 最大值 (N) 而无需键入它(即使它在另一个 "auxiliary column" 的所有行中重复)。 或者如果有更好的方法从每一端获得这 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;
非常感谢!
Proc RANK
计算可用于 select 所需行的百分位数。
示例:
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;