как я могу справиться с итеративной системой именования для этого?

У меня есть набор данных такого типа, этот набор данных содержит некоторые пропущенные значения (я представляю их с помощью 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  |

Я хочу добавить наблюдения по идентификатору, используя только один столбец переменной, я назову эту переменную VAR: что-то вроде инвертированного формата процедуры по идентификатору; вар ВАР;.

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

поэтому я попытался разделить СТАРЫЙ набор данных на разные наборы данных (NEWa NEWb ...NEWn), где в каждом наборе данных у нас есть все неотсутствующие наблюдения, хранящиеся в столбце с именем VAR. Потом солью NEWa NEWb...NEВn в NEWdataset и применю proc sort для восстановления порядка по 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
Уточнение: всегда ли категории в каждом var отличаются друг от друга? IOW: Можно ли получить одно и то же значение для двух разных переменных?   -  person Leo    schedule 04.09.2015


Ответы (2)


Вместо этого попробуйте транспонировать процедуру, вы можете удалить отсутствующее на втором этапе или добавить предложение where в исходящий набор данных. Если вы хотите создать подмножества после этого на основе идентификатора, разделите их на шаге данных.

*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 и никогда раньше не слышал о вызове 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