SAS软件:如何删除因变量超过五个零的观测值

SAS软件:如何删除因变量超过五个零的观测值,sas,filtering,data-cleaning,Sas,Filtering,Data Cleaning,我有一个消费者面板数据,记录了零售店每周的消费情况。唯一标识符是住户ID。如果支出中出现五个以上的零,我想删除观察值。也就是说,这户人家有五个星期没有购买任何东西。一旦确定,我将删除与住户ID相关的所有观察结果。有人知道我如何在SAS中实施此程序吗?谢谢。我认为proc-SQL在这里会很好 这可以通过一个更复杂的子查询在一个步骤中完成,但最好将其分解为两个步骤 计算每个家庭ID有多少个零 筛选以仅包括具有5个或更少零的家庭ID proc-sql 创建表0\u cnt作为 选择不同的住户id, 总

我有一个消费者面板数据,记录了零售店每周的消费情况。唯一标识符是住户ID。如果支出中出现五个以上的零,我想删除观察值。也就是说,这户人家有五个星期没有购买任何东西。一旦确定,我将删除与住户ID相关的所有观察结果。有人知道我如何在SAS中实施此程序吗?谢谢。

我认为proc-SQL在这里会很好

这可以通过一个更复杂的子查询在一个步骤中完成,但最好将其分解为两个步骤

  • 计算每个家庭ID有多少个零

  • 筛选以仅包括具有5个或更少零的家庭ID

  • proc-sql
    创建表0\u cnt作为
    选择不同的住户id,
    总和(支出=0,则为1,否则为0结束)为num_零
    从原始数据
    按住户id分组

    create table wanted as
    select *
    from original_data   
    where household_id in (select distinct household_id from zero_cnt where num_zeroes <= 5);  
    quit;
    
    使用滞后运算符:检查以前的支出金额

    有关滞后的更多信息,请点击此处:

    然后只需使用子查询或匹配合并来删除“排除”数据集中的ID

    proc sql;  
      create table wanted as  
      select *  
      from original_data;  
      where household_id not in(select distinct household_id from excluded);  
    quit;
    

    发布您尝试过的内容和示例数据。这个过程将是计算连续0周的数量,确定超过5周的所有id,然后删除这些id。可以是数据步骤、SQL解决方案或组合。发布示例数据和您尝试过的内容,有人可以在我的一般建议之外提供帮助。一般问题->一般回答谢谢。对于以下情况,您将如何修改代码。结果变量的零计数是可以的,只要我们没有连续的五个零。再次感谢。
    data exclude;   
      set sorted;   
      by household_id;    
      array prev{*} _L1-_L4;  
     _L1 = lag(spending);  
     _L2 = lag2(spending);  
     _L3 = lag3(spending);  
     _L4 = lag4(spending);  
    
      * Create running count for the number of observations for each ID;
      if first.household_id; then spend_cnt = 0;  
      spend_cnt + 1;  
    
      * Check if current ID has at least 5 observations to check. If so, add up current spending and previous 4 and output if they are all zero/missing;  
      if spend_cnt >= 5 then do;  
        if spending + sum(of prev) = 0 then output;  
      end;  
      keep household_id;
    run;
    
    proc sql;  
      create table wanted as  
      select *  
      from original_data;  
      where household_id not in(select distinct household_id from excluded);  
    quit;