我正在尝试使用PROC SQL更新字段。需要发生的是基于一个标准,二进制值字段需要改变第n个值。
示例:00100更新为00110。
我希望使用substr命令,但它没有按预期运行。
Data Test;
Input Binary $;
Datalines;
000
001
010
100
;
Run;
Proc SQL;
Select Case When substr(Binary,2,1) eq '0' Then Substr(Binary,2) = '1' End as Binary2
From Test;
Quit;
此查询仅返回字符串中的第二个字符,而不是更新,而不是返回更新的二进制变量。
答案 0 :(得分:0)
SELECT
不能以您使用它的方式使用左侧的SUBSTR。实际上,包括等号使得它与你的想法有很大的不同 - 它不会返回字符串的第二个字符,但它返回TRUE或FALSE。这恰好匹配第二个字符,因为你的字符是1或0而你正在测试它为1,但仍然。
Proc SQL;
Select Case When substr(Binary,2,1) eq '0' Then
case when Substr(Binary,2) = '1' then return 1 else 0 end
End as Binary2
From Test;
Quit;
这就是SAS正在做的事情。
如果要在SQL中执行此操作,则必须构造子字符串,或者最好在数据步骤中执行此操作,以允许您使用left-hand-substr。
这可行,例如:
Proc SQL;
Select cats(substr(binary,1,1),'1',substr(binary,3)) as Binary2
From Test;
Quit;
答案 1 :(得分:0)
对于实际位标记的情况,使用来自按位族的函数
BOR (value, mask)
打开位BAND (value, BNOT (mask))
关闭位BXOR (value, mask)
切换位以下是一些演示使用这些按位函数的示例操作。使用diagnostic
列观察发生采样操作的行以及操作前的原始值。
按位函数参数值范围为0..2 32 -1。当然,变量仍然是用于存储目的的双精度。
Data have;
case_id + 1;
Input
BitFlag binary3.; Datalines;
000
001
010
100
;
Run;
* extended sample data, every bit combination for 10 bits representing binary flag0-flag9;
data have;
do bitflag = 0 to 2**10-1;
output;
end;
stop;
array diagnostic(10);
format bitflag diag: binary10.;
run;
示例操作
proc sql;
update have
set
bitflag = bor ( bitflag , 2**5 )
, diagnostic1 = bitflag
where
band ( bitflag , 2**5 ) = 0
;
update have
set
bitflag = band ( bitflag , bnot ( 2**7 ) )
, diagnostic2 = bitflag
where
band ( bitflag , 2**1 ) = 0
and band ( bitflag , 2**3 ) > 0
;
update have
set
bitflag = bor (
band ( bitflag , bnot ( 2**9 ) ),
2**8
)
, diagnostic3 = bitflag
;
update have
set
bitflag = bxor ( bitflag, bor (2**0 , 2**1 ) )
, diagnostic4 = bitflag
;
注意:General SAS以#####x
的形式理解十六进制文字,但没有理解位文字的语法。您可以使用此宏来使用文字位字符串的位字符解释进行编码。
%macro BIT_LITERAL(bitstring);
%sysfunc(inputn(&bitstring,binary32.));
%mend;
%put NOTE: %BIT_LITERAL(1);
%put NOTE: %BIT_LITERAL(1001);
----- LOG -----
NOTE: 1
NOTE: 9
注意:DATA Step确实理解用于位测试的位掩码,但没有用于值赋值的位字法语法。
Proc DS2
让SAS会话使用 具有二进制常量语法的DS2语言,以十六进制或二进制表示(x'hex-string'
和b'bit-string'
)