НАЙТИ ЛОГИКУ ДЛЯ СОРТИРОВКИ ДАННЫХ - PullRequest
0 голосов
/ 01 мая 2018

Я новичок в SAS, и у меня есть некоторые даты как

VIT_A 12 23 22 0 32 0 11
VIT_C 10 9 0 21 0 26 76

a

если я хочу перечислить только данные, где VIT_A ^=0, VIT_C^=0, что будет логикой?

Результаты будут

VIT_A 12 23 22 32 11
VIT_C 10 9 21 26 76

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

Если ваши данные выглядят так: Таблица 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

Output

0 голосов
/ 02 мая 2018

Просто используйте оператор 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;
0 голосов
/ 01 мая 2018

Вы можете транспонировать свои данные, а затем выбирать нулевые значения в макропеременной.

Предполагая, что значения находятся в столбцах, а не в строках:

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
...