请选择 进入手机版 | 继续访问电脑版
楼主: LWN.
1256 3

SAS中如何用其他变量数值填补两条记录间的缺失 [推广有奖]

  • 0关注
  • 0粉丝

本科生

19%

还不是VIP/贵宾

-

威望
0
论坛币
1248 个
通用积分
0
学术水平
1 点
热心指数
2 点
信用等级
0 点
经验
1118 点
帖子
13
精华
0
在线时间
136 小时
注册时间
2016-6-8
最后登录
2022-5-21

LWN. 发表于 2017-3-13 20:32:58 |显示全部楼层 |坛友微信交流群
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 ...
关键词:如何用 数据集 记录 如何
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

使用道具

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;
看下能不能再简化一下~
已有 1 人评分经验 收起 理由
李会超 + 100 精彩帖子

总评分: 经验 + 100   查看全部评分

使用道具

wwang111 发表于 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;

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-3-29 18:21