как мога да се справя с итеративна система за именуване за това?

Имам набор от данни от този вид, този набор от данни съдържа някои липсващи стойности (представям ги с X).

ID  VA  VB  ... Vn      |       ID  VA  VB  ... Vn  |   
1   a1  b1  ... n1      |       1   a1  X   ... n1  |
2   a2  b2  ... n2      |===    2   X   b2  ... X   |
3   a3  b3  ... n3      |===    3   a3  b3  ... n3  |
..................      |       ..................  |
N   aN  bN  ... nN      |       N   X   bN  ... nN  |

Искам да добавя наблюдения по ID, като използвам само една променлива колона, ще нарека тази променлива VAR: нещо като формат на обърната процедура по ID; var VAR;.

ID  VAR
1   a1
..
1   n1 
2   b2
..
3   a3
3   b3
..
3   n3
..
N   bN
..  
N   nN

така че се опитах да разделя OLDdataset на различни набори от данни (NEWa NEWb ...NEWn), където във всеки набор от данни имаме всички наблюдения, които не липсват, съхранени в колона, наречена VAR. След това ще обединя NEWa NEWb ... NEWn в NEWdataset и ще приложа процедура за сортиране за възстановяване на реда по ID.

Проблемът възникна, когато разбрах, че "n" не е известно преди анализа, защото искам да настроя обобщен код, който няма да работи само за един набор от данни, а VA VB VN са резултат от стъпка на формат на proc.

Ако n знае, бих използвал нещо подобно:

data NEWa NEWb NEWc;
set OLDdataset;
array try[3] VA VB VC ;
if try[1] ne '.' then output NEWa;
if try[1] ne '.' then output NEWb;
if try[1] ne '.' then output NEWc;
run;

Но сега имам нужда от някаква итеративна система за именуване, която може би може да звучи като:

data NEW_i;                     <-------- "i" must be assigned
set OLDdataset;
array try[*] V: ;
do i=1 dim(try);
if try[i] ne '.' then output NEW_i; <---- "i" must be assigned
run;

Надяваме се, че това звучи ясно. Някакви съвети? Благодаря.


person stat    schedule 27.11.2014    source източник
comment
Пояснение: категориите във всяка променлива винаги ли са различни една от друга? IOW: Можете ли да имате една и съща стойност за две различни променливи?   -  person Leo    schedule 04.09.2015


Отговори (2)


Вместо това опитайте транспониране на proc, можете да изтриете липсващите във втора стъпка или да добавите клауза where към изходящия набор от данни. Ако искате да създадете подмножества след това въз основа на ID, отделете ги в стъпка с данни.

*generate sample data;
data have;
array V(20) v1-v20;
do ID=1 to 10;
    do i=1 to 20;
    v(i)=rand('normal', 0, 1);
    if v(i) < -2 then v(i)=.;
    end;
    output;
end;
drop i;
run;

*Flip data;
proc transpose data=have out=want(where=(var1 ne .)) prefix=Var;
    by id;
run;

*Separate into different data sets;
data _null_;
    set want;
    by id;
    call execute(catt("data var", id, "; set want; where id=", id, ";run;"));
run;
person Reeza    schedule 27.11.2014
comment
скъпи @Reese, това е страхотен опит, благодаря за помощта. Не крия, че съм доста нов в SAS средата и никога преди не съм чувал за call execute(). :) - person stat; 28.11.2014

Ако съм разбрал правилно сценария, вие имате работа с числови променливи, така че на тази основа може да не е задължително да разделяте данните по променлива в различни набори от данни, тъй като трябва да можете да използвате nmiss() функция, която връща броя на липсващите числови стойности, напр. в подгрупа, ако:

data newdataset;
  set olddataset;
  if nmiss(&varlist)=0;
run;

където &varlist може да се създаде точно преди да се използва olddataset в горната стъпка с данни (както казахте, че броят на променливите може да бъде динамичен), като се използва:

/* note literals are case sensitive */
proc sql noprint;
  select name into :varlist separated by ','
  from dictionary.columns
  where libname='WORK'
    and memname='OLDDATASET'
    /* use following if you also have non-numeric variables */
    /* and type='num' */
  ;
quit;

Можете да използвате следното, за да видите съдържанието на &varlist:

%put varlist=&varlist;

или дори да използвате следната опция, преди макропроменливата да бъде препратена:

options symbolgen;
person Amir    schedule 27.11.2014
comment
скъпи @Amir специални благодарности за опита! както и да е, почти съм сигурен, че това няма да работи поради следното: if nmiss(&varlist)=0; всичките ми колони ще върнат 0, защото всички те имат поне липсваща стойност :) освен това, работя със символни променливи (категорични многостепенни) и много съжалявам, че не съм посочил това в текста. - person stat; 28.11.2014