我是SAS的初学者,我有一些日期行
VIT_A 12 23 22 0 32 0 11
VIT_C 10 9 0 21 0 26 76
如果我只想列出VIT_A ^=0
,VIT_C^=0
那些逻辑是什么的数据?
结果将是
VIT_A 12 23 22 32 11
VIT_C 10 9 21 26 76
答案 0 :(得分:1)
如果您的数据如下表 1 :
COL1 COL2
1 VIT_A VIT_C
2 12 10
3 23 9
4 22 0
您只需使用where
子句
如果您的数据如下表 [2] :
COL1 COL2
1 VIT_A VIT_C
2 12 23 22 0 32 0 11 10 9 0 21 0 26 76
然后,您可以使用tranwrd
函数将' '
替换为','
,然后将'0'
替换为''
表 1 的解决方案:
数据:
data have;
input VIT_A VIT_C;
datalines;
12 10
23 9
22 0
0 21
3 20
0 26
11 76
;
run;
创建两个没有任何0
值的新表,并将行号添加为obs
:
proc sql;
create table VIT_A as
select monotonic() as obs , VIT_A from have where VIT_A ne 0 ;
create table VIT_C as
select monotonic() as obs ,VIT_C from have where VIT_C ne 0;
quit;
合并两个表:
data want;
merge VIT_A VIT_C;
by obs;
run;
输出:
obs=1 VIT_A=12 VIT_C=10
obs=2 VIT_A=23 VIT_C=9
obs=3 VIT_A=22 VIT_C=21
obs=4 VIT_A=3 VIT_C=20
obs=5 VIT_A=11 VIT_C=26
obs=6 VIT_A=. VIT_C=76
答案 1 :(得分:0)
您可以转置数据,然后在宏变量中选择无零值。
假设值在列中而不在行中:
data have;
length string $100. ;
format string $100. ;
input string $ v1 v2 v3 v4 v5 v6 v7;
datalines;
VIT_A 12 23 22 0 32 0 11
VIT_C 10 9 0 21 0 26 76
;
run;
proc transpose data=have out=trans name=value;
by string;
run;
proc sql noprint ;
select COL1 into :VIT_A separated by ' ' from trans where string="VIT_A" and COL1 <> 0;
select COL1 into :VIT_C separated by ' ' from trans where string="VIT_C" and COL1 <> 0;
quit;
Data Want;
string='VIT_A';
Values="&VIT_A.";
output;
string='VIT_C';
Values="&VIT_C.";
output;
run;
输出:
string=VIT_A Values=12 23 22 32 11
string=VIT_C Values=10 9 21 26 76
答案 2 :(得分:0)
只需使用WHERE语句吗?
proc print data=have ;
where vit_a ne 0 ;
run;
如果要测试多个变量,请确保将它们与正确的逻辑组合在一起。
where vit_a ne 0 AND vit_c ne 0;
与
不同where vit_a ne 0 OR vit_c ne 0;