如何在 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;
我在 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;