我正在尝试清除某些观察结果的数据。我只想保留行,其中至少10个变量之一包含某个值(代码)。数据集非常大,可以包含大量的变量值。我可能只想保留以“ C”开头的观测值所在的行。可以将它们编码为C000到CA798之间的任何数字,依此类推。我也想保留该行,如果它在某处有其他观察结果,但是这次可能是UG63000至UG68999和UG74。每行仅需要出现一次所需的代码,但是如果行中某处存在多个所需的代码,则不会有问题。后来我想对它们进行编码,以便在任何一个感兴趣的值存在的地方都得到1。
因此,问题在于将具有某些值的代码的掉落/保持条件归纳为通用,而不必对可能的每个值进行硬编码,例如: 如果变量1 = C000或变量1 = C0001或变量2 = C000或变量2 = UG63,则保留 等等。
一行可能看起来像这样:
ID Var1 Var2 ... Var10
Xyz C700 TI0213 ... Z892DA
答案 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')
或者您可以使用宏进行更多的概括。