全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1541 3
2017-03-13
悬赏 5 个论坛币 已解决
SAS中如何用其他变量数值填补两条记录间的缺失,比如有下面数据集,a、b、c为三个变量
a   b   c
1   4   .
1   5   .
1   7   7
1   8   .
1   9   9
2   4   4
2   5   .
2   6   6
2   7   .
3   4   .
3   5   5
3   6   .
3   7   7
我想生成这种:
a   b   c
1   4   .
1   5   .
1   7   7
1   8   8
1   9   9
2   4   4
2   5   5
2   6   6
2   7   .
3   4   .
3   5   5
3   6   6
3   7   7

最佳答案

renjingli2011 查看完整内容

data test1; input a b c; cards; 1 4 . 1 5 . 1 7 7 1 8 . 1 9 9 2 4 4 2 5 . 2 6 6 2 7 . 3 4 . 3 5 5 3 6 . 3 7 7 ; proc sort; by a b c; run; data test2; set test1; by a; retain seq 1; if ~missing(c) then do; seq + 1; end; run; proc sql noprint; create table test3 as select count(seq) as num, s ...
二维码

扫码加我 拉你入群

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

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

全部回复
2017-3-13 20:32:59
data test1;
  input a b c;
  cards;
1   4   .
1   5   .
1   7   7
1   8   .
1   9   9
2   4   4
2   5   .
2   6   6
2   7   .
3   4   .
3   5   5
3   6   .
3   7   7
;
proc sort; by a b c; run;
data test2;
  set test1;
  by a;
  retain seq 1;
  if ~missing(c) then do; seq + 1; end;
run;
proc sql noprint;
   create table test3 as
   select count(seq) as num, seq, a, b, c from test2
   group by seq;
quit;
data test4;
  set test3;
  where seq ^=1 and num=2 and missing(c);
  c = b;
run;
data test_final;
  set test4 test3(where = (num^=2)) test3(where=(num=2 and seq =1)) test3(where = (num=2 and ~missing(c)));
  drop seq num;
run;
proc sort; by a b c; run;
用这个没有d
二维码

扫码加我 拉你入群

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

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

2017-3-14 10:05:12
data test1;
  input a b c;
  cards;
1   4   .
1   5   .
1   7   7
1   8   .
1   9   9
2   4   4
2   5   .
2   6   6
2   7   .
3   4   .
3   5   5
3   6   .
3   7   7
;
proc sort; by a b c; run;
data test2;
  set test1;
  by a;
  retain seq 1;
  if ~missing(c) then do; seq + 1; end;
run;
proc sql noprint;
   create table test3 as
   select count(seq) as num, seq, a, b, c from test2
   group by seq;
quit;
data test4;
  set test3;
  where seq ^=1 and num=2 and missing(c);
  c = b;
run;
data test_final;
  set test4 test3(where = (num^=2)) test3(where=(num=2 and seq =1)) test3(where = (num=2 and ~missing(c)));
  drop seq num d;
run;
proc sort; by a b c; run;
看下能不能再简化一下~
二维码

扫码加我 拉你入群

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

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

2017-3-14 11:00:39
data obs1;
set test;
obs=_n_;
run;

proc sort data=obs1;
by a obs;
run;

proc sql;
create table obs2 as
select a, min(obs) as minobs, max(obs) as maxobs
from obs1
where c ne .
group by a
order by a;
quit;

data wanted;
merge obs1 obs2;
by a;
if minobs<obs<maxobs then c=b;
drop obs minobs maxobs;
run;
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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