Как заполнить данные в таблице SAS? - PullRequest
0 голосов
/ 03 мая 2020

У меня есть таблица в SAS, и она выглядит следующим образом: Первичный ключ - Имя-Фамилия.

Row   Name       Surname      Country       Sec    Salary
1     Foo         Bar          SP            1      1500
2     Foo         Bar          SP            2      
3     Foo         Bar                        3      1500
4     Foo1        Bar1                       1      2000
5     Foo1        Bar1         IT            2      2000
6     Foo1        Bar1         IT            3      2000
7     Foo1        Bar1         IT            4      
8     Foo2        Bar2         PO            1       
8     Foo2        Bar2                       2       850  
9     Foo2        Bar2                       3       
10    Foo2        Bar2         PO            4     

В нем есть пустые поля, как его заполнить, чтобы они были как в таблице ниже?

Row   Name       Surname      Country       Sec    Salary
1     Foo         Bar          SP            1      1500
2     Foo         Bar          SP            2      1500
3     Foo         Bar          SP            3      1500
4     Foo1        Bar1         IT            1      2000
5     Foo1        Bar1         IT            2      2000
6     Foo1        Bar1         IT            3      2000
7     Foo1        Bar1         IT            4      2000
8     Foo2        Bar2         PO            1       850
8     Foo2        Bar2         PO            2       850
9     Foo2        Bar2         PO            3       850
10    Foo2        Bar2         PO            4       850

Спасибо.

Ответы [ 2 ]

1 голос
/ 04 мая 2020

DOW l oop может обрабатывать группы по, чтобы определить 1-е не пропущенное значение, которое затем будет использоваться в качестве значения вменения.

data have; input
Row   Name $     Surname  $   Country $     Sec    Salary; datalines;
1     Foo         Bar          SP            1      1500
2     Foo         Bar          SP            2      .
3     Foo         Bar          .             3      1500
4     Foo1        Bar1         .             1      2000
5     Foo1        Bar1         IT            2      2000
6     Foo1        Bar1         IT            3      2000
7     Foo1        Bar1         IT            4      .
8     Foo2        Bar2         PO            1      .
8     Foo2        Bar2         .             2       850  
9     Foo2        Bar2         .             3      .
10    Foo2        Bar2         PO            4      .
;

data want;
  do _n_ = 1 by 1 until (last.surname);
    set 
      have (obs=0 rename=(country=_1st_country salary=_1st_salary))
      have
    ;
    by name surname;
    if missing(_1st_country) then if not missing(country) then _1st_country = country;
    if missing(_1st_salary ) then if not missing(salary ) then _1st_salary  = salary;
  end;

  do _n_ = 1 to _n_;
    set have;
    if missing(country) then country = _1st_country;
    if missing(salary ) then salary  = _1st_salary;
    OUTPUT;
  end;

  drop _1st:;
run;
1 голос
/ 03 мая 2020

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

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;
...