如何在 SAS table 中完成数据?

How to complete data in a SAS table?

我在 SAS 中有一个 table,它看起来像这样: 主键是姓名。

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     

它有空字段,我如何填写才能使它们像下面的 table 一样?

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

谢谢。

假设您的数据按姓名和姓氏排序,并且您只想从具有相同姓名和姓氏的行中获取值, 对于姓名和姓氏的每个组合,将所有数据读入两次。

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 _:;

由于保留的值没有进一步使用,因此将它们从结果中删除。 _(请注意 first_visit 和 second_visit 也被删除,因为我们定义它们的方式。)_

    drop _:;
run;

DOW 循环可以按组处理以确定第一个非缺失值,然后将其用作插补值。

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;