2016-01-20 2 views
2

У меня есть большой набор данных, который может быть разрезан на следующее:SAS назад сохранить

ID x 
1 0 
1 0 
1 0 
1 1 
1 1 

У меня есть один идентификатор переменной говорит мне, который индивидуум, что значение X соответствует.

Переменная X равна 0, если для этого пользователя не было события и 1, если произошло событие.

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

ID x x2 
1 0 1 
1 0 1 
1 0 1 
1 1 1 
1 1 1 

Следовательно, x2 принимает значение 1 во всех наблюдениях, поскольку x принимает значение 1 по меньшей мере в одном экземпляре.

Я рассмотрел создание обратного отставания по «ведущей технике SAS», но он, похоже, не может сохранить значение, поэтому мне нужно будет сделать обратную задержку несколько раз, что не является вариантом, поскольку мой фактический набор данных содержит тысячи строк, и каждый идентификатор требует разного количества лагов.

Есть ли у кого-нибудь идеи о том, как это решить?

Заранее благодарен!

+0

Я попробовал ответы от Джо и Флойда, и они оба отлично поработали. Спасибо вам обоим! – user2182066

ответ

2

Самый простой способ сделать это двойной цикл DoW.

data want; 
    do _n_ = 1 by 1 until (last.id); 
    set have; 
    by id; 
    if x then x2=1; 
    end; 
    do _n_ = 1 by 1 until (last.id); 
    set have; 
    by id; 
    output; 
    end; 
run; 

Этот цикл по набору данных один раз, чтобы найти значение х2, устанавливает его, а затем снова через петлю для вывода данных. Фактически у вас нет retain, потому что это все в одной итерации цикла шагов данных для одного ID - x2 не сбрасывается, кроме как между идентификаторами.

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

2

Попробуйте SQL-решение.

proc sql; 
create table flagged as 
select 
    a.*, 
    b.x2 
from 
    table a 
    join 
    (select 
    id, 
    max(x) as x2 
    from table 
    group by id) b 
    on 
    a.id = b.id 
; 
quit; 
1

Вы можете сделать это, объединив данные с собой, применив параметр набора данных where= ко второй копии. Вам нужно будет сохранить копию переменной X, но переименован, чтобы она могла использоваться в where=. Вы можете использовать эту переименованную переменную как новый X2, но тогда вам нужно будет преобразовать пропуски в нули. Или вы можете использовать параметр набора IN= для генерации новой переменной X2 с значениями 0/1.

data want; 
    merge have have(in=in2 keep=id x rename=(x=x3) where=(x3=1)) ; 
    by id; 
    x2 = in2; 
    drop x3; 
run; 
Смежные вопросы