我有一份可能有手机号码、家庭电话号码或两者都有的人的名单。该数据集通常为手机号码和家庭电话号码列出相同的号码。这就是我试图为每条记录做的事情:
if cellphonenumber = (homephonenumber) then keep (cellphonenumber) and drop (homephonenumber)
我尝试了不同的组合,但无法正常工作。我有能力为 Access 编写 SQL 和 VBA,并且已经分支到 SAS。我知道语法不同,而且 Access 没有完整的库(即无法识别“distinct”)。
答案 0 :(得分:1)
这里有两种方法。 SAS 支持 SQL,但您应该熟悉数据步骤,因为它是 SAS 最强大的工具之一。
数据步骤
假设您的数据如下所示:
id home cell
1 111-111-0123
2 222-222-0123 222-222-0123
3 333-333-0123 444-444-0123
如果您想删除家庭电话号码,那么简单的 if-then
逻辑就可以正常工作。在 SAS 中,字符列缺少 ' '
,数字列缺少 .
。您可以选择使用 call missing()
子例程自动为您设置。
data want;
set have;
if(home = cell) then home = ' ';
run;
SQL
您也可以在 SQL 中执行此操作:
proc sql;
create table want as
select id
, CASE
when(home = cell) then home = ' '
else home
END as home
, cell
from have
;
quit;
其他信息
如果您的数据不干净并且有前导或尾随空格,您可以遍历所有字符列以确保删除所有前导/尾随空格。如果您需要标准化您的家庭/手机号码,您需要执行一些额外的标准化逻辑(请注意,如果您有权访问 SAS Data Quality Server,所有这些都可以自动为您完成)。
下面将遍历每个字符变量并运行 strip()
函数以删除每一行的前导和尾随空格。
data want;
set have;
array charvars[*] _CHARACTER_;
do i = 1 to dim(charvars);
charvars[i] = strip(charvars[i]);
end;
if(home = cell) then home = ' ';
drop i;
run;
查看 SAS's free e-learning 以获取有关 SAS 编程概念的培训。