我的数据集如下所示,但包含数千行。
Firstname Lastname Emailaddress
John Smith John.Smith@mail.com
Anna Blake Anna.Blake@mail.com
Susan Peterson 1962_Peterson_Susan@mail.com
David Anderson RandomEmail_1956@mail.com
我想创建一个变量,告诉我电子邮件地址是否包含人员的名字或名字,而忽略了位置。如果找到匹配项,则变量将返回值1,如果未找到匹配项,则返回值0.
我创建了以下逻辑,适用于大多数情况。
Data CheckNames;
Set MyDataSet;
LenFM = Length(FirstName);
LenLM = Length(LastName);
If Substr(EmailAddress,1,LenFM) = FirstName or Substr(EmailAddress,1,LenLM) = LastName then Match = 1;
Else Match = 0;
运行;
此逻辑将返回Match = 1表示前两个结果,Match = 0表示最后两个结果。但是我希望第三次观察返回Match = 1,因为它包含了人的名字。
我的问题是,是否有一个SAS命令允许我遍历变量Firstname和Lastname中的所有观察结果,然后扫描是否在变量EmailAddress中找到了名称。
我尝试使用Find()
和PrxMatch()
,但它们似乎都需要硬编码值,因此无法实现此目的。
谢谢!
答案 0 :(得分:2)
FIND
和PRXMATCH
都可以正常工作,并且不需要硬编码值。 FIND
对此非常有效。添加修饰符t
以告诉它修剪firstname / lastname变量中的空格(或使用trim
函数)。
data MyDataSet;
length firstname lastname emailaddress $50;
input Firstname $ Lastname $ Emailaddress $;
datalines;
John Smith John.Smith@mail.com
Anna Blake Anna.Blake@mail.com
Susan Peterson 1962_Peterson_Susan@mail.com
David Anderson RandomEmail_1956@mail.com
;;;;
run;
Data CheckNames;
Set MyDataSet;
Match = find(EmailAddress,Firstname,'t') | find(EmailAddress,LastName,'t');
run;
我在|
使用OR
两个查找函数的值,但如果您愿意,可以更明确地执行此操作。