При условии, что ваши данные отсортированы по имени и фамилии, и вы хотите принимать значения только из строк с одинаковыми именем и фамилией, для каждой комбинации имени и фамилии прочитайте все данные дважды.
data want;
set have (in=first_visit) have (in=second_visit);
by Name Surname;
При первом посещении запомните страну и зарплату из строк, в которых она заполнена. Если существуют разные не пропущенные значения, поместите предупреждение в журнал.
if first_visit then do;
if first.Surname then do;
_Country = Country;
_Salary = Salary;
end;
else do;
if missing(_Country) then _Country = Country;
else if _Country ne Country and not missing(Country) then put
'WARNING: different values:' Country= ' and ' _Country
' for ' Name= Surname=;
if missing(_Salary) then _Salary = Salary;
else if _Salary ne Salary and not missing(Salary) then put
'WARNING: different values:' Salary= ' and ' _Salary
' for ' Name= Surname=;
end;
end;
При втором посещении заполните поля с помощью значения сохраняются с первого посещения. (Обратите внимание, что нам не нужна переменная second_visit
, но легче понять, если я ее все равно определю.)
else do; * this is the _second_visit ;
if missing(Country) then Country = _Country;
if missing(Salary) then Salary = _Salary;
end;
Чтобы это работало, мы должны явно сохранить временные значения, потому что SAS по умолчанию инициализирует все переменные для каждого наблюдения. (Я начал все их имена с _
, потому что затем я могу ссылаться на них с помощью подстановочного знака, но это работает, только если вы поместите оператор retain после создания переменных.)
retain _:;
Поскольку сохраненные значения больше не используются, отбросьте их из результата. _ (Обратите внимание, что first_visit и second_visit также удаляются из-за того, как мы их определили.) _
drop _:;
run;