全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2517 5
2017-01-23
大家好,现在有一个问题想要请教。假如分析师在非交易日出具了一份报告,而我需要得到该报告出具日对应的交易日(也就是离报告出具日最近的交易日),那么程序要怎么做。
或者说,我现在有一列数                   (希望得到的)
1                                          1
2                                          2
3                                          3
blank                                      3
blank                                      3  
blank                                      4
4                                          4
5                                          5
6                                          6
blank                                      6   
7                                          7
8                                          8
blank                                      8
blank                                      8
blank                                      8
blank                                      9
blank                                      9  
9                                          9
10                                         10
……                                       ……
请问在SAS或者STATA里我应该怎样编程呢?
谢谢啦~~


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2017-1-23 14:34:10
data test;
input num @@;
cards;
1 2 3 . . . 4 5 6 . 7 8 . . . . 9 10
;

data wanted;
  set test;
  retain _num;
  if num ne . then _num=num;
  else num=_num;
  drop _num;
run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-1-23 14:47:59
wwang111 发表于 2017-1-23 14:34
data test;
input num @@;
cards;
多谢啦^_^
但这个做出来的是把每一个空格处都填上上一条的值,有没有什么办法可以把每一个空格处都填上离其最近的非空格值呢,比如,8,blank,blank,blank,blank,blank,9,10得到8,8,8,8,9,9,9,10呢?
如果blank是偶数个,那么正好一半blank同前,一半blank同后;
如果blank是奇数个,那么最中间的blank同前同后均可。
太感谢啦~~
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-1-23 15:23:48
sorry,开始没看清楚你的例子;
试试这个,如果blank是奇数个,在test2那一步,中间的同前用ceil函数,同后用int函数:

data test;
input num @@;
cards;
1 2 3 . . . . 4 5 6 . 7 8 . . . . . 9 10
;

data test1;
  set test;
  obs=_n_;
  lagnum=lag(num);
  if nmiss(num,lagnum)=1 then grp+1;
  if num ne . then n=0;
  else n+1;
  drop lagnum;
run;

proc sql;
create table test2 as
select *, ceil(max(n)/2) as sn
from test1
group by grp
order by obs;
quit;

data test3;
set test2;
retain _num;
if num ne . then _num=num;
else if num=. and n<=sn then num=_num;
drop _num;
run;

proc sort data=test3;
by descending obs;
run;

data test4;
set test3;
retain _num;
if num ne . then _num=num;
else num=_num;
drop _num;
run;

proc sort data=test4(keep=num obs) out=wanted;
by obs;
run;



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-1-23 15:54:59
哇,太感谢了多谢大神啦^_^
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-1-23 15:55:22
wwang111 发表于 2017-1-23 15:23
sorry,开始没看清楚你的例子;
试试这个,如果blank是奇数个,在test2那一步,中间的同前用ceil函数,同后 ...
哇,太感谢了多谢大神啦^_^
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群