楼主: dxystata
1153 3

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

版主

大师

34%

还不是VIP/贵宾

-

TA的文库  其他...

Software

中英文Ebook

R学习

威望
2
论坛币
182304 个
通用积分
15205.6031
学术水平
208 点
热心指数
271 点
信用等级
174 点
经验
291157 点
帖子
5375
精华
1
在线时间
13478 小时
注册时间
2006-6-21
最后登录
2024-4-26

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

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
拉您进交流群

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

GMT+8, 2024-4-27 04:37