0

我有一个数据集have,其中一个条目具有多个变量,如下所示:

message reference time  qty  price 
x       101       35000 100  .

上述数据集每次都在循环中更改,其中message可以为 =“A”。如果message="X" 那么这意味着从 MASTER 集中删除 100 个数量,其中reference数量等于referenceMASTER 数据库中的数量。price= 。是因为它已经在reference=101下的MASTER数据库中了。MASTER 数据库以某个价格和可用数量汇总所有可用订单。如果在下一个循环中message=“A”,那么have数据集将如下所示:

留言参考时间数量价格A 102 35010 150 500

那么这意味着向referenceMASTER 数据库添加一个新号码。也就是说,要append线到MASTER。

当有messageX 时,我的循环中有以下代码来更新我的 MASTER 数据库中的数量:

data b.master;
modify b.master have(where=(message="X")) updatemode=nomissingcheck;
by order_reference_number;
if _iorc_ = %sysrc(_SOK) then do;
replace;
end;
else if _iorc_ = %sysrc(_DSENMR) then do;
      output;
      _error_ = 0;
    end;
else if _iorc_ = %sysrc(_DSEMTR) then do;
      _error_ = 0;
end;
else if _iorc_ = %sysrc(_DSENOM) then do;
_error_ = 0;
end;
run;

我使用replace来更新数量。但是自从我输入price=。什么时候message是 X,上面的代码设置了price='.' where reference=101 在 MASTER 中通过replace语句...我不想要。因此,我更喜欢删除数据集中的价格列message=X have。但是我不想在message=A 时删除列价格,因为我使用了这段代码

proc append base=MASTER data=have(where=(msg_type="A")) force;
run;

因此,我的Modify声明中有这个代码价格:

data have(drop=price_alt); 
set have; if message="X" then do; 
output;end; 
else do; /*I WANT TO MAKE NO CHANGE*/ 
end;run;

但它没有做我想要的。如果消息不等于 X,那么我不想删除该列。如果它等于 X,我想删除该列。如何调整上面的代码以使其工作?

4

2 回答 2

3

老实说,这是一个奇怪的要求,以至于它引发了关于你正在做的事情是否是最好的做事方式的问题。但是,本着回答问题的精神...

DomPazz 的答案提供了将数据分成两个可能的集合的选项,但是如果您希望代码始终引用特定的数据集,这会产生其自身的复杂性。

您也不能在一个数据步骤中告诉 SAS 输出到一个实例有列而一个实例没有的“相同”数据集。因此,您希望代码本身是动态的,以便存在的数据步骤要么是删除列,要么是不删除列,具体取决于 message=x。这个问题的答案是动态代码,就像 SAS 中的许多东西一样,解决了对宏的创造性使用。它看起来像这样:

/* Just making your input data set */

data have;
message='x';
time=35000;
qty=1000;
price=10.05;
price_alt=10.6;
run;

/* Writing the macro */

%macro solution;
    %local id rc1 rc2;

    %let id=%sysfunc(open(work.have));
    %syscall set(id);
    %let rc1=%sysfunc(fetchobs(&id, 1));
    %let rc2=%sysfunc(close(&id));

%IF &message=x %THEN %DO;
    data have(drop=price_alt);
    set have;
    run;
%END;

%ELSE %DO;
    data have;
    set have;
    run;
%END;
%mend solution;

/* Running the macro */

%solution;
于 2013-09-25T23:44:48.883 回答
3

尝试这个:

data outX(drop=price_alt) outNoX;
set have;
if message = "X" then
   output outX;
else
   output outNoX;
run;

正如@sasfrog 在评论中所说,一个表要么有一个列,要么没有。如果你想对 MESSAGE="X" 的东西进行子集化,那么你可以使用这样的东西来创建 2 个数据集。

于 2013-09-25T22:35:13.123 回答