如何从SAS中另一个变量的值向新变量分配值

时间:2020-02-27 23:07:17

标签: sas

因此,我从另一个名为sitesweb2的数据库创建了一个名为sitesweb的新数据库,因为我只想保留某些变量。这些只是二进制变量。

然后我想创建一个名为fonction的新变量,该变量将采用:

  • 在M N O P Q R S T U变量中为1时,值为1。
  • 当AA AB AC AD AE AF AG AH AI AJ变量中为1时,值为2。
  • 当AK AL变量中为1时,值为3。

我有以下代码,但没有创建fonction变量:

Data DEV1.SITESWEB2;
set DEV1.SITESWEB ; 
keep INDUSTRIE M N O P Q R S T U AA AB AC AD AE AF AG AH AI AJ AK AL ;
if M or N or O or P or Q or R or S or T or U in ('1') then fonction = 1 ;
else if AA or AB or AC or AD or AE or AF or AG or AH or AI or AJ in ('1') then fonction = 2;
else if AK or AL in ('1') then fonction = 3;
run;

怎么了?

3 个答案:

答案 0 :(得分:0)

每个变量都需要运算​​符/右操作数。不符合条件:-

If M='1' or N='1' or ... then fonction=1;

如果它们是数字变量,则可以将它们加到求和函数中:

if sum(M,N,...)>=1 then...

但显然它们是文本变量,而不是实际的二进制(数字)变量。

偶然地,我确定您还可以在%do中使用asc()循环和%sysfunc()函数,传递适当的ascii数字以迭代字母变量,然后传递结果作为宏变量进入数据步骤以自动构建if。这需要花费更多的精力,但是如果您重复运行此操作,则它是一种更优雅的解决方案。

希望这会有所帮助,

菲尔

答案 1 :(得分:0)

在连接引用变量的数组的结果中检查'1'

array _1_vars M N O P Q R S T U;
array _2_vars AA AB AC AD AE AF AG AH AI AJ;
array _3_var3 AK AL;

select;
  when (index(cats(of _1_vars(*),'1') then fonction = '1';
  when (index(cats(of _2_vars(*),'1') then fonction = '2';
  when (index(cats(of _3_vars(*),'1') then fonction = '3';
  otherwise ;
end;

这将适用于字符和数字变量。数组的变量必须全部具有相同的类型。

答案 2 :(得分:0)

要检查变量列表中是否出现值,可以使用WHICH()或WHICHC()函数。它将返回首次找到的变量的编号。如果找不到,它将返回零。 SAS将0视为错误,将其他任何数字视为true。

data DEV1.SITESWEB2;
  set DEV1.SITESWEB ;
  keep INDUSTRIE M N O P Q R S T U AA AB AC AD AE AF AG AH AI AJ AK AL ;
  if whichc('1', of M N O P Q R S T U) then fonction = 1 ;
  else if whichc('1', of AA AB AC AD AE AF AG AH AI AJ) then fonction = 2;
  else if whichc('1', of AK AL) then fonction = 3;
  keep fonction ;
run;

请确保保留新变量。