在满足某些要求时保持观察

时间:2019-04-03 13:27:54

标签: sas

我正在尝试清除某些观察结果的数据。我只想保留行,其中至少10个变量之一包含某个值(代码)。数据集非常大,可以包含大量的变量值。我可能只想保留以“ C”开头的观测值所在的行。可以将它们编码为C000到CA798之间的任何数字,依此类推。我也想保留该行,如果它在某处有其他观察结果,但是这次可能是UG63000至UG68999和UG74。每行仅需要出现一次所需的代码,但是如果行中某处存在多个所需的代码,则不会有问题。后来我想对它们进行编码,以便在任何一个感兴趣的值存在的地方都得到1。

因此,问题在于将具有某些值的代码的掉落/保持条件归纳为通用,而不必对可能的每个值进行硬编码,例如: 如果变量1 = C000或变量1 = C0001或变量2 = C000或变量2 = UG63,则保留 等等。

一行可能看起来像这样:

ID Var1 Var2 ... Var10

Xyz C700 TI0213 ... Z892DA

2 个答案:

答案 0 :(得分:0)

您可能希望研究将数据转换为更规范的格式,以便代码中只有一个变量。然后,您可以合并到查找表以对代码进行分类。

要简化代码生成,可以创建一个宏。像这样:

%macro condition(varlist,valuelist);
%local i j sep;
(
%do i=1 %to %sysfunc(countw(&varlist));
%do j=1 %to %sysfunc(countw(&valuelist));
 &sep %scan(&varlist,&i) = %upcase("%scan(&valuelist,&j)")
%let sep=or;
%end;
%end;
)
%mend condition;

然后可以在WHERE语句中使用它。或创建一个新的0/1变量。

%let varlist=var1 var2 var3 ;
data want;
  set have;
  where %condition(&varlist,C0001 C0002);
  diseaseA = %condition(&varlist,D0001 D0002);
end;

答案 1 :(得分:0)

(请提供一些示例数据,以便我们测试您的情况。)

这个问题还不清楚,所以我将提供几种可能性。

  

variable1 = C000或变量1 = C0001或变量2 = C000

如果您只想检查variable1是否以“ C”开头,那么您可以使用1简化这三个条件:

variable1 =: 'C'
  

UG63000至UG68999和UG74

这里的规则是什么? 如果规则是“以'UG'开头”,则

variable2 =: 'UG'

如果该规则位于预定义列表中,则可以使用以下方式:

variable2 in ('UG63000','UG68999','UG74')

或者您可以使用宏进行更多的概括。