У меня есть набор данных, который содержит несколько числовых и символьных столбцов. Большинство столбцов символов - это простые вопросы «да» или «нет», но некоторые - нет. Для числовых столбцов я чувствую, что у меня есть правильное решение. Для столбцов символов я попытался минимизировать это, но не удалось. То, что я хочу сделать , и попытался, это цикл, который утверждает, что когда j = номер столбца var4 , тогда используйте замены Big / Small / IU. Идея состоит в том, что это сделает код менее «зависимым от переменной» из-за того, что я могу изменить переменную для var4 в операторе% let, и код будет короче по длине.
Поскольку оператор dim дает мне общее количество числовых или символьных столбцов, я предполагаю, что есть некоторый параметр, который дает мне расположение столбцов конкретной переменной, которую я использовал бы для цикла secound. Однако я не нашел такого заявления.
Мой код пока что
%let v1 = var1;
%let v2 = var2;
%let v3 = var3;
%let v4 = var4;
data have;
infile datalines delimiter = '|';
input surveyYear id var1 var2$ var3 var4$20. ;
datalines;
2016 | 1 | 10 | Yes | 5 | BIG
2016 | 2 | 6 | YES | 8 | Big
2016 | 3 | 8 | YEs | 99999 | big
2016 | 4 | . | yes | 5 | 99999
2017 | 5 | 6 | No | 7 | SMALL
2017 | 6 | 5 | Ye | . | small
2017 | 7 | 99999 | no | 3 | 99999
2018 | 8 | 3 | 99999 | 1 | SMall
2018 | 9 | 2 | iu | 2 | IU
2018 | 10 | 15 | IU | . | Iu
;
run;
data want;
set have;
array var_num[*] _numeric_;
do i=3 to dim(var_num);
if var_num[i] = 99999 then var_num[i] = .;
end;
array var_cha[*] _character_;
do j=1 to dim(var_cha);
var_cha(j) = upcase(var_cha(j));
if var_cha[j] = 'YES' then var_cha[j] = 'Yes';
if var_cha[j] = 'NO' then var_cha[j] = 'No';
if var_cha[j] = 'IU' then var_cha[j] = 'IU';
if var_cha[j] = '99999' then var_cha[j] = 'IU';
if var_cha[j] = '' then var_cha[j] = 'IU';
end;
/* Integrate the code below into the loop*/
if &v4 = 'BIG' then &v4 = 'Big city';
if &v4 = 'SMALL' then &v4 = 'Small city';
if &v4 = 'IU' then &v4 = 'Unknow city size';
if &v4 = '99999' then &v4 = 'Unknow city size';
drop i j;
run;
Концептуальная идея, как я хотел бы запрограммировать его,
data want;
set have;
array var_cha[*] _character_;
do j=1 to dim(var_cha);
var_cha(j) = upcase(var_cha(j));
/* All of the if statements for the yes, no and IU */
if var_cha[j] = ColumnNumerOfVar4 then do;
/* where ColumnNumerOfVar4 is equal to the column number of var4*/
if var_cha[j] = 'BIG' then var_cha[j] = 'Big city';
if var_cha[j] = 'SMALL' then var_cha[j] = 'Small city';
if var_cha[j] = 'IU' then var_cha[j] = 'Unknow city size';
if var_cha[j] = '99999' then var_cha[j] = 'Unknow city size';
end;
end;
run;