2012-04-12 2 views
0

Я пытаюсь сделать некоторые существующие значения отсутствующими значениями (не удаляя их). Вот базовая структура моего набора данных.SAS: значения отсутствуют

Я хочу рассматривать AGE и GENDER как отсутствующие, когда A меньше B. Например, когда A = 1 и B = 3, я хочу обрабатывать значения AGE и GENDER в последних двух строках как отсутствующие (как показанный на наборах данных).

В моих данных оба A и B идут от 1 до 4 и имеют каждую комбинацию из них.

Звездочки означают, что у меня есть больше данных между ними. Заранее спасибо!

BEFORE 
    ID A B AGE GENDER 
    -------------- 
    1 1 1 35 M 
    * * * * * 
    * * * * * 
    5 1 2 23 F 
    5 1 2 21 M 
    6 1 2 42 F 
    6 1 2 43 M 
    * * * * * 
    * * * * * 
    20 1 3 43 F 
    20 1 3 39 M 
    20 1 3 23 M 
    21 1 3 32 F 
    21 1 3 39 M 
    21 1 3 23 F 
    * * * * * 
    * * * * * 
    55 2 4 32 M 
    55 2 4 12 M 
    55 2 4 31 F 
    55 2 4 43 M 
    * * * * * 
    * * * * * 

AFTER  
    ID A B AGE GENDER 
    -------------- 
    1 1 1 35 M 
    * * * * * 
    * * * * * 
    5 1 2 23 F 
    5 1 2 . . 
    6 1 2 42 F 
    6 1 2 . . 
    * * * * * 
    * * * * * 
    20 1 3 43 F 
    20 1 3 . . 
    20 1 3 . . 
    21 1 3 32 F 
    21 1 3 . . 
    21 1 3 . . 
    * * * * * 
    * * * * * 
    55 2 4 32 M 
    55 2 4 12 M 
    55 2 4 . . 
    55 2 4 . . 
    * * * * * 
    * * * * * 
+0

Я добавил переменный ID, а также еще несколько значений, чтобы отличить как наблюдения группы по переменному В. – Ken

ответ

5

Как нас найти?

data temp; 
    retain idcount 0; 
    set olddata; 

    ** Create an observation counter for each id **; 
    prev_id = lag(id); 

    if id ^= prev_id then idcount = 0; 
    idcount = idcount + 1; 

run; 


** Sort the obs by ID in reverse order **; 
proc sort data=temp; 
    by id descending idcount; 
run; 

data temp2; 
    retain misscount 0; 
    set temp; 
    by id descending idcount; 

    ** Keep the previous age and gender **; 
    old_age = age; 
    old_gender = gender; 

    ** Count the number that should be missing **; 
    if a < b then nummiss = b - a; 
    else nummiss = 0; 

    ** Set a counter of obs that we will set to missing **; 
    if first.id then misscount = 0; 

    ** Set the appropriate number of rows to missing and update the counter **; 
    if misscount < nummiss then do; 
     misscount = misscount + 1; 
     call missing(age, gender); 
    end; 
run; 

proc sort data=temp2 out=temp3(drop=misscount nummiss idcount prev_id); 
by id idcount; 
run; 
+2

Я думаю, что есть поперечный ряд аспекты для решения ОП требует не просто сравнение данных в строке. Для достижения результата в «после» данных должна быть какая-то логическая группа с RETAIN. Я бы проверил некоторый код и разместил решение, но я нахожусь на iPhone в поезде :) – sasfrog

+0

@sasfrog Спасибо за указание сохраненных значений в данных после. – Ken

+0

@ user1294223 Код не выдавал то, что я хотел, между прочим. Кроме того, создание новых переменных для AGE и GENDER было бы разумным, ради ведения записей. – Ken

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

  • Нет связанных вопросов^_^