首页 > 解决方案 > 如何补全 SAS 表中的数据?

问题描述

我在 SAS 中有一个表,它看起来像这样:主键是 Name-Surname。

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

谢谢你。

标签: sasenterprise-guide

解决方案


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

data want;
    set have (in=first_visit) have (in=second_visit);
    by Name Surname;

第一次访问时,请记住填写的行中的 Country 和 Salary。如果存在不同的非缺失值,请在日志中发出警告。

    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;

推荐阅读