2016-01-13 6 views
0

У меня есть набор данных, который выглядит так, но со многими, много более переменных пар:Какой самый простой способ получить SAS?

Stuff2016 Stuff2008 Earth2016 Earth2008 Fire2016 Fire2008 
    123456  5646743   45  456   456 890101 
    541351 543534534   45  489   489  74456 
    352352  564889   98  489489  1231  189 
    464646 542235423   13  15615  1561  78 
    987654  4561889   44  1212  12121  111 

Для каждой пары почти одинаковыми именами переменных, я хочу SAS вычитать 2016 года данные - данные за 2008 год, не вводя переменную имена.

Какой самый простой способ сказать SAS сделать это, не указывая при этом имена переменных? Есть ли способ сказать ему вычесть каждую другую переменную минус ту, которая предшествует ей, без упоминания имен конкретных переменных?

Большое спасибо !!!!

ответ

2

Я бы, скорее всего, рекомендовал три массива, но вы могли сделать это с одним. Это сильно зависит от порядка переменных, который не является хорошим предположением в моей книге. Также, как бы вы назвали результаты автоматически?

data want; 
set have; 

array vars(*) stuff2016--fire2008; 
array diffs(*) diffs1-diffs20; *something big enough to hold difference; 

do i=1 to dim(vars)-1; 
    diffs(i) = vars(i)-vars(i+1); 
end; 
run; 

Вместо этого, я настоятельно рекомендую вам использовать таблицы словаря запрашивать ваши имена переменных и динамически генерировать свои списки переменных, которые затем передаются на трех различных массивов, по одному на 2016, один в 2008 и один для разница. Имя libname и memname хранятся в верхнем регистре в таблице Dictionary, поэтому имейте это в виду.

data have; 
input Stuff2016 Stuff2008 Earth2016 Earth2008 Fire2016 Fire2008; 
cards; 
    123456  5646743   45  456   456 890101 
    541351 543534534   45  489   489  74456 
    352352  564889   98  489489  1231  189 
    464646 542235423   13  15615  1561  78 
    987654  4561889   44  1212  12121  111 
    ; 
run; 

proc sql; 
select name into :var2016 separated by " " 
from sashelp.vcolumn 
where libname='WORK' 
and memname='HAVE' 
and name like '%2016' 
order by name; 


select name into :var2008 separated by " " 
from sashelp.vcolumn 
where libname='WORK' 
and memname='HAVE' 
and name like '%2008' 
order by name; 

select catx("_", compress(name, ,'d'), "diff") into :vardiff separated by " " 
from sashelp.vcolumn 
where libname='WORK' 
and memname='HAVE' 
and name like '%2016' 
order by name; 

quit; 

%put &var2016.; 
%put &var2008.; 
%put &vardiff.; 

data want; 
set have; 
array v2016(*) &var2016; 
array v2008(*) &var2008; 
array diffs(*) &vardiff; 

do i=1 to dim(v2016); 
diffs(i)=v2016(i)-v2008(i); 
end; 

run; 
+0

** Прекрасный !!!!! ** О, спасибо большое! !! Мне нравится ваше второе решение, учитывая, что имена переменных, предшествующие году, могут различаться. _Dynamically генерация переменных names_ именно то, что я хочу сделать. И чтобы ответить на ваш вопрос «Также, как бы вы назвали результаты автоматически?» Я бы сохранил результаты как столбец с расширением суффикса или что-то в этом роде, как вы правильно предсказали. – user650738

Смежные вопросы