ilyx1
不知道怎么描述了,就是比如我关心一个数值型变量,想知道多达比例的取值最高的那部分观测之和可以占到全体样本之和的百分之八十比如.
类似freq里的累计频数,
ynot
好问题,一个函数可能解决不了
看看大家有什么好的算法
yihui
跑题一下,这个问题在R里面一个简单的累加cumsum()就解决了,比如
> (x=c(1,3,4,8,6,4,5,6,7,3,5,4)) #原始数据
[1] 1 3 4 8 6 4 5 6 7 3 5 4
> sort(x,decreasing=T) #从大到小排序
[1] 8 7 6 6 5 5 4 4 4 3 3 1
> sort(x,decreasing=T)/sum(x) #每个数字占所有数字之和的比例
[1] 0.14285714 0.12500000 0.10714286 0.10714286 0.08928571 0.08928571 0.07142857 0.07142857 0.07142857 0.05357143 0.05357143 0.01785714
> cumsum(sort(x,decreasing=T)/sum(x)) #累计比例
[1] 0.1428571 0.2678571 0.3750000 0.4821429 0.5714286 0.6607143 0.7321429 0.8035714 0.8750000 0.9285714 0.9821429 1.0000000
> cumsum(sort(x,decreasing=T)/sum(x))>0.80 #哪些累计百分比是大于80%的
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE
> sum(!cumsum(sort(x,decreasing=T)/sum(x))>0.80) #当累加到第8个数字时,累计百分比就大于80%了
[1] 7
ynot
** 和R差不多,SAS这样算也可以;
*** 也是上面的数据 ***;
data a;
input x@@;
datalines;
1 3 4 8 6 4 5 6 7 3 5 4
;
run;
**********************;
PROC SQL;
SELECT sum(x) INTO :sumx FROM a;
SELECT count(x) INTO :countx FROM a;
QUIT;
RUN;
proc sort data=a;
by descending x;
run;
data a;
set a;
y+x;
m=100*y/&sumx;
n=100*_n_/&countx;
run;
proc print;run;
** m 列就是累计频数;
** n 列就是累计样本数;
rtist
[quote]引用第3楼ynot于2007-07-28 01:55发表的“”:
data a;
set a;
y+x;
m=100*y/&sumx;
n=100*_n_/&countx;
run;
.......[/quote]
怎么会不retain y?
karina0529
[quote]引用第4楼rtist于2007-07-28 15:30发表的“”:
怎么会不retain y?[/quote]
是阿 做出累计比例後用retain不就好了?
ynot
[quote]引用第4楼rtist于2007-07-28 15:30发表的“”:
怎么会不retain y?[/quote]
高手就是高手,话说得是见首不见尾
rtist
[quote]引用第6楼ynot于2007-08-03 08:56发表的“”:
高手就是高手,话说得是见首不见尾[/quote]
不好意思,我自己还没想明白“尾巴”在哪儿呢?
abel
data result;
set your_dataset;
retain cumsum 0;
cumsum=cumsum+your_var;
run;
proc print;
run;
quit;
hongtianli
还是retain比较方便,但是3楼的SQL也不错啊。顺便问一下,3楼朋友给出的程序中“&”是什么意思啊?