由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Statistics版 - 请教一个SAS选择性输出数据的问题,急,有包子
相关主题
问个sql的问题吧,搞不出来了.[问题]sql into产生宏变量长度的限制
大家练练手吧,挺有意思的一道题怎样算一个variable前5个值的mean
SAS时间处理求教请教 sas regression 问题
一道sas题 在线求解 50个包子答谢 急啊[合集] help - sas proc sql with do loop
Help on SAS: how to reconstruct recordssas sql proc问题请教
##问一个SAS de 问题##请问怎么建立变量全是ordinal data的model?急,谢谢。
sas proc means/freq问题sas code 求助
大家一般有什么软件做association study?Re: 请问SAS如何学起?
相关话题的讨论汇总
话题: p2话题: d2话题: 100话题: d1话题: 105
进入Statistics版参与讨论
1 (共1页)
f*******i
发帖数: 8492
1
刚刚接触SAS不到3个月,还有很多不懂的地方。最近在做一个课程的小project,编程思路上被卡住了,希望高人能够指点以下。
因为只知道数据可以横向处理,像这种带条件的,不规则的,还是纵向处理数据的project还是第一次碰到。
比如我有数据如下:
公司 日期1(D1) 日期2(D2) 金额1 (P1) 金额2(P2)
1 2001.03.01 2001.03.30 100 150
1 2001.03.06 2001.03.30 100 120
1 2001.03.29 2001.03.30 100 90
1 2001.04.01 2001.04.30 200 160
1 2001.04.15 2001.04.30 200 180
1 2001.04.20 2001.04.30 200 190
1 2001.04.28 2001.04.30 200 180
2 2001.03.01 2001.03.30 105 112
2 2001.03.08 2001.03.30 105 110
2 2001.03.28 2001.03.30 105 60
2 2001.04.05 2001.04.30 100 90
2 2001.04.16 2001.04.30 100 80
2 2001.04.27 2001.04.30 100 105
2 2001.04.28 2001.04.30 100 110
2 2001.04.29 2001.04.30 100 110
现在,打算实现如下运算。
计算1:
以“日期2”为基准,如果“日期1”是在“日期2”之前的30天之内,则把这些“日期1”所对应的“金额2”取平均值,得到“基数1”,之后用“金额1”减去“基数1”。
计算2:
以“日期2”为基准,取“日期1”中距离“日期2”最近的一天,把该“日期1”所对应的“金额2”作为“基数2”,之后用“金额1”减去“基数2”。
========================================================================
====
==========
我昨天想破头,编了下面这个程序,目前只能实现一半我需要的功能。实际上,我想要
得到的平均值,就是以不同的公司和“日期2”来划分的。
之前先数据处理,同一家公司,D1-D2范围大于30天的数据,进行删除。其中公司是用
代码来表示的,比如公司1和公司2。
然后进行如下操作
data test;
set dansas.test;
dummy_date+0;
dummy_company+0; /* Initial dummy value is zero*/
do i=1 to 1;
if company=dummy_company and d2=dummy_date then
do j=1 to 1;
cum_p2+p2;
no+1;
mean_p2=cum_p2/no;
end;
else
do k=1 to 1;
cum_p2=0;
no=1;
dummy_date=d2;
dummy_company=company;
cum_p2=p2;
mean_p2=cum_p2/no;
end;
end;
run;
proc print data=test;
var dummy_date dummy_company p2 cum_p2 mean_p2;
run;
=======================================================
结果会得到如下运行结果:
Company D1 D2 P1 P2 NO cum_P2 mean_p2
1 2001.03.01 2001.03.30 100 150 1 150 150
1 2001.03.06 2001.03.30 100 120 2 270 135
1 2001.03.29 2001.03.30 100 90 3 360 120 需要
1 2001.04.01 2001.04.30 200 160 1 160 160
1 2001.04.15 2001.04.30 200 180 2 340 170
1 2001.04.20 2001.04.30 200 190 3 530 176.7
1 2001.04.28 2001.04.30 200 180 4 710 177.5 需要
2 2001.03.01 2001.03.30 105 112 1 112 112
2 2001.03.08 2001.03.30 105 110 2 222 111
2 2001.03.28 2001.03.30 105 60 3 282 94 需要
2 2001.04.05 2001.04.30 100 90 1 90 90
2 2001.04.16 2001.04.30 100 80 2 170 85
2 2001.04.27 2001.04.30 100 105 3 275 91.5
2 2001.04.28 2001.04.30 100 110 4 385 96.3
2 2001.04.29 2001.04.30 100 110 5 495 99 需要
可以看出,我做的平均值实际上就是“累加金额2”除以前面的“累加个数”。但实际上,只有每个“日期2”周期内,最后一个“日期1”所对应的平均值才是真实我想要的30天内的"金额2"的平均值。
然后,我需要用“金额1”减去这个“需要”的“平均值”,在把这些数字从表格中提取出来。
现在的问题是,如何可以只把需要的那几行数字提取出来。我如果仅仅用“金额1”减去“平均值”,列在前面的几个结果,实际上是无效的。
f*******i
发帖数: 8492
2
表格排版好了,希望大家帮忙看看。
主要问题就是如何把标有“需要”的数据,选择性的输出。
有包子酬谢。
s******y
发帖数: 352
3
你这茉复杂的问题 加上你那么多未必, 没10个包子都不好意思出手。 你看这给吧。
data have;
input comp D1 :yymmdd10. D2 :yymmdd10. P1 P2;
format d1 d2 date9.;
cards;
1 2001.03.01 2001.03.30 100 150
1 2001.03.06 2001.03.30 100 120
1 2001.03.29 2001.03.30 100 90
1 2001.04.01 2001.04.30 200 160
1 2001.04.15 2001.04.30 200 180
1 2001.04.20 2001.04.30 200 190
1 2001.04.28 2001.04.30 200 180
2 2001.03.01 2001.03.30 105 112
2 2001.03.08 2001.03.30 105 110
2 2001.03.28 2001.03.30 105 60
2 2001.04.05 2001.04.30 100 90
2 2001.04.16 2001.04.30 100 80
2 2001.04.27 2001.04.30 100 105
2 2001.04.28 2001.04.30 100 110
2 2001.04.29 2001.04.30 100 110
;
run;
proc sql;
create table want1 as
select *, p1-mean_p2 as newp from have natural left join
(select distinct comp,d2, sum(case when d2-d1<=30 then 1 else . end) as
No,
sum(case when d2-d1<=30 then p2 else . end) as cum_p2,
mean(case when d2-d1<=30 then p2 else . end) as mean_p2
from have group by comp,d2) ;
quit;
h******s
发帖数: 3420
4
yes, i would prefer sql too

【在 s******y 的大作中提到】
: 你这茉复杂的问题 加上你那么多未必, 没10个包子都不好意思出手。 你看这给吧。
: data have;
: input comp D1 :yymmdd10. D2 :yymmdd10. P1 P2;
: format d1 d2 date9.;
: cards;
: 1 2001.03.01 2001.03.30 100 150
: 1 2001.03.06 2001.03.30 100 120
: 1 2001.03.29 2001.03.30 100 90
: 1 2001.04.01 2001.04.30 200 160
: 1 2001.04.15 2001.04.30 200 180

f*******i
发帖数: 8492
5
你好,10个包子不成问题
首先,我的数据是已经现成的,所以不需要导入
我主要的问题是在你proc sql语言那一段,因为初学,所以对sql语言不太了解。
能否请你稍微解释一下这几句的意思:
(select distinct comp,d2, sum(case when d2-d1<=30 then 1 else . end) as
No,
sum(case when d2-d1<=30 then p2 else . end) as cum_p2,
mean(case when d2-d1<=30 then p2 else . end) as mean_p2
from have group by comp,d2) ;
另外,根据问题2,如果我想选择离D2最近的D1对应的P2,来被P1减,这个该怎么做?
谢谢

【在 s******y 的大作中提到】
: 你这茉复杂的问题 加上你那么多未必, 没10个包子都不好意思出手。 你看这给吧。
: data have;
: input comp D1 :yymmdd10. D2 :yymmdd10. P1 P2;
: format d1 d2 date9.;
: cards;
: 1 2001.03.01 2001.03.30 100 150
: 1 2001.03.06 2001.03.30 100 120
: 1 2001.03.29 2001.03.30 100 90
: 1 2001.04.01 2001.04.30 200 160
: 1 2001.04.15 2001.04.30 200 180

f*******i
发帖数: 8492
6
关键是我初学,基本上不会SQL
所以只能用笨办法,一点一点写 LOL

【在 h******s 的大作中提到】
: yes, i would prefer sql too
h******s
发帖数: 3420
7
没关系,俺以前GROUP 一个SR STATISTICIAN 十年经验不用SQL,全用DATA 最笨的办法
写,
照样被老板重用,因为老板更不懂,哈哈

【在 f*******i 的大作中提到】
: 关键是我初学,基本上不会SQL
: 所以只能用笨办法,一点一点写 LOL

s******r
发帖数: 1524
8
data have;
input comp D1 :yymmdd10. D2 :yymmdd10. P1 P2;
format d1 d2 date9.;
cards;
1 2001.03.01 2001.03.30 100 150
1 2001.03.06 2001.03.30 100 120
1 2001.03.29 2001.03.30 100 90
1 2001.04.01 2001.04.30 200 160
1 2001.04.15 2001.04.30 200 180
1 2001.04.20 2001.04.30 200 190
1 2001.04.28 2001.04.30 200 180
2 2001.03.01 2001.03.30 105 112
2 2001.03.08 2001.03.30 105 110
2 2001.03.28 2001.03.30 105 60
2 2001.04.05 2001.04.30 100 90
2 2001.04.16 2001.04.30 100 80
2 2001.04.27 2001.04.30 100 105
2 2001.04.28 2001.04.30 100 110
2 2001.04.29 2001.04.30 100 110
;
run;
proc sql;
create table c1 as
select a.comp, a.d1,a.d2,a.p1,a.p2,
avg(b.p2) as no1, p1-avg(b.p2) as cal1
from have a inner join have b
on a.comp =b.comp and a.d1 between b.d2-30 and b.d2-1
group by a.comp,a.d1,a.d2,a.p1,a.p2
order by a.comp,a.d2,a.d1
;quit;run;
proc sql;
create table t1 as
select c1.comp,aa.d2,min(c1.d1) format=yymmdd10. as min_d1
from c1 inner join
(select a.comp, a.d2, min(a.d2-b.d1) as min_diff
from c1 a inner join c1 b
on a.comp=b.comp
group by a.comp,a.d2) aa
on c1.comp=aa.comp and c1.d1=aa.d2-min_diff
group by c1.comp, aa.d2
order by c1.comp, aa.d2
;quit;run;
you should know the rest.
Good luck,
baozi pls.

【在 f*******i 的大作中提到】
: 你好,10个包子不成问题
: 首先,我的数据是已经现成的,所以不需要导入
: 我主要的问题是在你proc sql语言那一段,因为初学,所以对sql语言不太了解。
: 能否请你稍微解释一下这几句的意思:
: (select distinct comp,d2, sum(case when d2-d1<=30 then 1 else . end) as
: No,
: sum(case when d2-d1<=30 then p2 else . end) as cum_p2,
: mean(case when d2-d1<=30 then p2 else . end) as mean_p2
: from have group by comp,d2) ;
: 另外,根据问题2,如果我想选择离D2最近的D1对应的P2,来被P1减,这个该怎么做?

s******y
发帖数: 352
9
then what about a datastep solution for both of your questions.
proc sort data=have;
by comp d2 d1;
run;
data want;
call missing(cum_p2,No,mindt,minp2);
do _n_=1 by 1 until(last.d2);
set have;
by comp d2;
if d2-d1<=30 then do;cum_p2+p2;No+1; mindt=d1;minp2=p2;end;
end;
mean_p2=cum_p2/No;
do _n_=1 to _n_;
set have;
newp=p1-mean_p2;
newp1=p1-minp2;
output;
end;
format mindt date9.;
run;

【在 f*******i 的大作中提到】
: 关键是我初学,基本上不会SQL
: 所以只能用笨办法,一点一点写 LOL

s******y
发帖数: 352
10
are you kidding? not using SQL==DATA 最笨的办法.

【在 h******s 的大作中提到】
: 没关系,俺以前GROUP 一个SR STATISTICIAN 十年经验不用SQL,全用DATA 最笨的办法
: 写,
: 照样被老板重用,因为老板更不懂,哈哈

相关主题
##问一个SAS de 问题##[问题]sql into产生宏变量长度的限制
sas proc means/freq问题怎样算一个variable前5个值的mean
大家一般有什么软件做association study?请教 sas regression 问题
进入Statistics版参与讨论
f*******i
发帖数: 8492
11
楼上两位包子都发了,自己查一下吧
我在根据你们的code自己考虑一下,多谢了
s******r
发帖数: 1524
12
There are two problems.
1. How about closest d1 beyond 30 days of d2
2. Whether d1 could be larger than d2
In the sample data, it works but there is some risk.

【在 s******y 的大作中提到】
: then what about a datastep solution for both of your questions.
: proc sort data=have;
: by comp d2 d1;
: run;
: data want;
: call missing(cum_p2,No,mindt,minp2);
: do _n_=1 by 1 until(last.d2);
: set have;
: by comp d2;
: if d2-d1<=30 then do;cum_p2+p2;No+1; mindt=d1;minp2=p2;end;

s******r
发帖数: 1524
13
Here I assume if there are two d1s have same distance with d2,
pick up the smaller one.
like,
2001.03.29, 2001.04.01 vs 2001.03.30.
you can change min(c1.d1) to max(c1.d1) if you like 2001.04.01.

【在 s******r 的大作中提到】
: data have;
: input comp D1 :yymmdd10. D2 :yymmdd10. P1 P2;
: format d1 d2 date9.;
: cards;
: 1 2001.03.01 2001.03.30 100 150
: 1 2001.03.06 2001.03.30 100 120
: 1 2001.03.29 2001.03.30 100 90
: 1 2001.04.01 2001.04.30 200 160
: 1 2001.04.15 2001.04.30 200 180
: 1 2001.04.20 2001.04.30 200 190

f*******i
发帖数: 8492
14
我要做的project是两问:
首先,D2是截止日期,所以不会出现D1>D2
第一问:以距离D2 30天的所有P2的mean为基数,用前面的P1减去这个基数,然后“每一
种”D2只对应
一个这样的差值,最后再按照公司和年份来分类。
第二问:以距离D2最近的一个D1所对应的P2作为基数,用前面的P1减去这个基数,同样
“每一种”D2只
对应一个这样的差值,最后再按照公司和年份来分类。
所以,针对第一问,我降在同一个D2周期内,D2-D1>30的无效数据都删除了,然后用剩
下的数据来进
行下一步处理。

【在 s******r 的大作中提到】
: There are two problems.
: 1. How about closest d1 beyond 30 days of d2
: 2. Whether d1 could be larger than d2
: In the sample data, it works but there is some risk.

s******y
发帖数: 352
15
we program per SPECs. the OP gives vague Specs on how to choose the cloeset
d1 to D2. i just assume the question 1 will be imposed on question2.
again, SPECs will guide your program's implementations.
But, your points or concerns are well taken.

【在 s******r 的大作中提到】
: There are two problems.
: 1. How about closest d1 beyond 30 days of d2
: 2. Whether d1 could be larger than d2
: In the sample data, it works but there is some risk.

r******m
发帖数: 369
16
楼主,不知道你还有包子没有了。我感觉你这个要求的重点在D2-D1,就是中间隔了多
少天。最后你想要的是一个aggregate的信息,而不是所有的observation。根据这个思
路,我给你写了个solution。
/* calculate days */
data have;
input comp D1 :yymmdd10. D2 :yymmdd10. P1 P2;
format d1 d2 date9.;
days=d2-d1;
cards;
1 2001.03.01 2001.03.30 100 150
1 2001.03.06 2001.03.30 100 120
1 2001.03.29 2001.03.30 100 90
1 2001.04.01 2001.04.30 200 160
1 2001.04.15 2001.04.30 200 180
1 2001.04.20 2001.04.30 200 190
1 2001.04.28 2001.04.30 200 180
2 2001.03.01 2001.03.30 105 112
2 2001.03.08 2001.03.30 105 110
2 2001.03.28 2001.03.30 105 60
2 2001.04.05 2001.04.30 100 90
2 2001.04.16 2001.04.30 100 80
2 2001.04.27 2001.04.30 100 105
2 2001.04.28 2001.04.30 100 110
2 2001.04.29 2001.04.30 100 110
;
run;
/* sort data based on company, d2, days, so for every combo of company
and
d2, the first record has smallest days*/
proc sort data=have;
by comp d2 days;
run;
/*generate an aggregate table based on lz's specifications*/
data aggregate (keep=comp d2 base1 base2);
retain base2;
set have;
by comp d2;
if first.d2=1 then do;
base2=p2;
end;
if days<30 then do;
cum_p2+p2;
n_p2+1;
end;
if last.d2=1 then do;
base1=cum_p2/n_p2;
cum_p2=0;
n_p2=0;
output;
end;
run;
r******m
发帖数: 369
17
楼主如果想要p1-base2,p1-base1,只要data step 的merge两个table, have和
aggregate就可以了。或者用proc sql也可以。
f*******i
发帖数: 8492
18
感谢大家的帮助,楼上的包子已经发了
我先把大家的code研究一下,再和大家讨论
r******m
发帖数: 369
19
收到了,楼主还是挺言而有信,不像之前有些人,:)
s******r
发帖数: 1524
20
xie bao zi.

【在 f*******i 的大作中提到】
: 感谢大家的帮助,楼上的包子已经发了
: 我先把大家的code研究一下,再和大家讨论

相关主题
[合集] help - sas proc sql with do loopsas code 求助
sas sql proc问题请教Re: 请问SAS如何学起?
请问怎么建立变量全是ordinal data的model?急,谢谢。申请SAS PROGRAMMER职位,要懂哪些东西?
进入Statistics版参与讨论
f*******i
发帖数: 8492
21
LOL
初来贵版,不知道这里有哪种不好的风气。
我在其他版发文求助,也是说道做到的。

【在 r******m 的大作中提到】
: 收到了,楼主还是挺言而有信,不像之前有些人,:)
f*******i
发帖数: 8492
22
请问,我如果想查看一下,这个数据库里总共有多少家公司,每个公司又有多少个D2数
据,应该用什么命令啊?
谢谢
r******m
发帖数: 369
23
Proc SQL;
Select comp,d2, count(*)
from have
Group by comp, d2
Order by comp, d2;
Quit;

请问,我如果想查看一下,这个数据库里总共有多少家公司,每个公司又有多少个D2数
据,应该用什么命令啊?谢谢
★ Sent from iPhone App: iReader Mitbbs 6.81 - iPhone Lite

【在 f*******i 的大作中提到】
: 请问,我如果想查看一下,这个数据库里总共有多少家公司,每个公司又有多少个D2数
: 据,应该用什么命令啊?
: 谢谢

r******m
发帖数: 369
24
Iphone不认识回车,加了空格

Proc SQL;Select comp,d2, count(*) from have
Group by comp, d2 order by comp, d2;Quit;
★ Sent from iPhone App: iReader Mitbbs 6.81 - iPhone Lite

【在 r******m 的大作中提到】
: Proc SQL;
: Select comp,d2, count(*)
: from have
: Group by comp, d2
: Order by comp, d2;
: Quit;
:
: 请问,我如果想查看一下,这个数据库里总共有多少家公司,每个公司又有多少个D2数
: 据,应该用什么命令啊?谢谢
: ★ Sent from iPhone App: iReader Mitbbs 6.81 - iPhone Lite

s******r
发帖数: 1524
25
proc sql;
select comp, count(distinct d2) as d2_cnt
from have
group by comp;
quit;run;

【在 f*******i 的大作中提到】
: 请问,我如果想查看一下,这个数据库里总共有多少家公司,每个公司又有多少个D2数
: 据,应该用什么命令啊?
: 谢谢

r******m
发帖数: 369
26
我理解错了,以为是看每种combo多少个records,
看多少个公司
select count(distinct comp)
from have
看每个公司多少个d2楼上的code应该可以

【在 r******m 的大作中提到】
: Proc SQL;
: Select comp,d2, count(*)
: from have
: Group by comp, d2
: Order by comp, d2;
: Quit;
:
: 请问,我如果想查看一下,这个数据库里总共有多少家公司,每个公司又有多少个D2数
: 据,应该用什么命令啊?谢谢
: ★ Sent from iPhone App: iReader Mitbbs 6.81 - iPhone Lite

f*******i
发帖数: 8492
27
大家都熟练操作sql啊
LOL
1 (共1页)
进入Statistics版参与讨论
相关主题
Re: 请问SAS如何学起?Help on SAS: how to reconstruct records
申请SAS PROGRAMMER职位,要懂哪些东西?##问一个SAS de 问题##
昨天考了SAS ADVANCED,不难sas proc means/freq问题
关于SAS Advance 9 的考试体会大家一般有什么软件做association study?
问个sql的问题吧,搞不出来了.[问题]sql into产生宏变量长度的限制
大家练练手吧,挺有意思的一道题怎样算一个variable前5个值的mean
SAS时间处理求教请教 sas regression 问题
一道sas题 在线求解 50个包子答谢 急啊[合集] help - sas proc sql with do loop
相关话题的讨论汇总
话题: p2话题: d2话题: 100话题: d1话题: 105