楼主: dxystata
1427 3

[问答] 后一条观测的4个变量取值和前一条观测相同,则替换为缺失 [推广有奖]

版主

已卖:302份资源

大师

37%

还不是VIP/贵宾

-

TA的文库  其他...

Software

中英文Ebook

R学习

威望
2
论坛币
183395 个
通用积分
15333.1475
学术水平
208 点
热心指数
271 点
信用等级
174 点
经验
298627 点
帖子
5586
精华
1
在线时间
13632 小时
注册时间
2006-6-21
最后登录
2025-12-22

初级学术勋章 初级热心勋章 中级热心勋章 初级信用勋章

楼主
dxystata 发表于 2019-5-28 21:38:08 |AI写论文
30论坛币
  1. data aaa;
  2. input zb$3. siteid no group visit value;
  3. cards;
  4. rbc  1   1  1  1  3.5
  5. rbc  1   1  1  2  4.0
  6. rbc  2   2  2  1  4.5
  7. wbc  1   1  1  1  9.0
  8. wbc  1   1  1  2  9.9
  9. wbc  2   2  2  1  9.3
  10. wbc  2   2  2  2  9.4
  11. ;
  12. run;
复制代码
如果指定前3个变量,后一条观测的4个变量取值和前一条观测相同,则替换为缺失。结果为:
zb siteid no group visit value
rbc  1   1  1  1  3.5
      .   .   1   2  4.0
rbc  2   2  2  1  4.5
wbc  1   1  1  1  9.0
        .   .  1  2  9.9
wbc  2   2  2  1  9.3
        .   .  2  2  9.4


如果指定前4个变量,后一条观测的4个变量取值和前一条观测相同,则替换为缺失。
则结果为:
zb siteid no group visit value
rbc  1   1  1  1  3.5
      .   .    .   2  4.0
rbc  2   2  2  1  4.5
wbc  1   1  1  1  9.0
        .   .  .  2  9.9
wbc  2   2  2  1  9.3
        .   .  . 2  9.4


希望能用macro实现,谢谢!







关键词:value Group Visit Input cards

沙发
magiclander 发表于 2019-5-31 17:20:25
可以使用lag解决。macro可以自己设计一下macro变量。

data b;
        set aaa;

        zb_lag = lag(zb);
        siteid_lag = lag(siteid);
        no_lag = lag(no);
        group_lag =lag(group);

        if zb=zb_lag and siteid=siteid_lag and no=no_lag and group = group_lag then do;
                zb = '';
                siteid = .;
                no = .;
                group =.;
        end;
        else if zb=zb_lag and siteid=siteid_lag and no=no_lag then do;
                zb = '';
                siteid = .;
                no = .;
        end;

        drop zb_lag siteid_lag no_lag group_lag;
run;
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
admin_kefu + 50 + 5 + 5 + 5 热心帮助其他会员

总评分: 论坛币 + 50  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

藤椅
luekemia 发表于 2019-7-8 17:40:25
应该是要这种效果吧,任意配置变量列表:

data aaa;
input zb$3. siteid no group visit value;
cards;
rbc  1   1  1  1  3.5
rbc  1   1  1  2  4.0
rbc  2   2  2  1  4.5
wbc  1   1  1  1  9.0
wbc  1   1  1  2  9.9
wbc  2   2  2  1  9.3
wbc  2   2  2  2  9.4
;
run;

/*任意配置以下变量列表即可*/
%let gv = zb,siteid,no;
/*%let gv = zb,siteid,no,group;*/


data _null_;
call symput('vv',  tranwrd("&gv." , "," , " ") );
call symput('mvv', tranwrd("&gv." , "," , "|") );
run;

%macro gend;
proc sort data = aaa;
by &vv;
;run;

%let i=1;
%do %until(%scan(&mvv,&i.,|)=);
%let lastv = %scan(&mvv,&i.,|);
%let i = %eval(&i.+1);
%end;


%let i=1;

data outds;
set aaa;
by &vv.;
if not first.&lastv. then do;
%do %until(%scan(&mvv,&i.,|)=);
%scan(&mvv,&i.,|)="";
%let i = %eval(&i.+1);
%end;
end;
run;

%mend;

%gend;

板凳
Fly胖头鱼 发表于 2019-7-31 13:37:11
指定前四个:
proc sort data=aaa;
    by zb siteid no group;
run;

data bbb;
    set aaa;
    by zb siteid no group;
    if first.group =0 then do;
    zb='';siteid=.;no=.;group=.;
    end;
run;
指定前三个:
proc sort data=aaa;
    by zb siteid no group;
run;

data bbb;
    set aaa;
    by zb siteid no group;
    if first.no =0 then do;
    zb=''; siteid=.; no=.;
    end;
run;

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-2-5 06:40