【问题标题】:How to flag or separate data based on a condition within an ID variable sas如何根据 ID 变量 sas 中的条件标记或分离数据
【发布时间】:2015-01-08 19:25:20
【问题描述】:

我想在一个 ID 变量中选择彼此相差 10% 的值。 例如,我的数据如下所示:

ID      Var1  
001     100  
001     109  
001     200  
001     210  
001     220  
001     300  
001     310  
002     500     
002     510   

我想要的输出是某种方式来标记它,以便我可以将它分成组:

ID      Var1   Flag    
001     100    1   
001     109    1      
001     200    2  
001     210    2     
001     220    2    
001     300    3   
001     310    3  
002     500    1  
002     510    1   

我尝试使用延迟函数和标记数据,但它只标记一对中的第二行;我无法提取一对中相差 10% 以内的两个值。

【问题讨论】:

  • Google 在 SAS 中“按组处理”。您可以在每个新 id 的开头初始化标志。
  • 嗨杰夫,你对初始化它的权利。但我的挑战是将标志分配给所涉及的两行。我只能标记第二行。例如,如果我考虑第 1 行和第 2 行我的条件是,如果 var1 和 lag(var1) 之间的差异小于 10%,那么 flag=1 在这种情况下它只分配一个标志来记录 2 var1=109
  • 在第一次观察新 ID 时,您不总是希望 Flag=1 吗?如果是这样,您不需要在该行上执行 lag() 逻辑——只需: if first.id then flag=1;
  • 您应该发布您尝试过的代码。

标签: sas


【解决方案1】:

如果记录之间的差异在 10% 以内,则说明如何标记。您可以通过将数字除以 1 并取绝对值来确定 10% 的比率。这假设您的数据按 ID 和升序 var1 值排序。

data want; 
set have;
by ID;
retain group;
lagv1=lag(var1);

if first.id then do;
    lagv1=.;
    group=1;
end;
else do;
    diff = abs(var1/lagv1-1);
    if diff >0.1 then group+1;
end;
run;

【讨论】:

    猜你喜欢
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    相关资源
    最近更新 更多