在SAS中重新编码表

在SAS中重新编码表,sas,Sas,我从外部邮件系统获取以下数据,其中邮件id对于一批电子邮件是唯一的 Email Mail_id Read_date a 1 12.jan b 1 12.jan c 1 14.jan a 2 14.jan b 2 14.jan c 2 16.jan 我正在尝试使用电子邮件和读取日期将这些数据映射回通信日志。为此,我假设至少有一个收件人在发送该批邮件的同一天阅

我从外部邮件系统获取以下数据,其中邮件id对于一批电子邮件是唯一的

Email  Mail_id    Read_date
 a      1      12.jan
 b      1      12.jan
 c      1      14.jan
 a      2      14.jan
 b      2      14.jan
 c      2      16.jan
我正在尝试使用电子邮件和读取日期将这些数据映射回通信日志。为此,我假设至少有一个收件人在发送该批邮件的同一天阅读该电子邮件。在上面的例子中,3个客户中有2个阅读了电子邮件12。jan,与通信日志中的发送日期相同。那很好。但是,邮件id为“1”的电子邮件“c”在1月14日阅读了该电子邮件。由于此客户属于mail_id=1的批次,我可以将此数据重新编码为1月12日,然后我可以将其映射回通信日志,其中发送日期为1月12日。由于批次相当大,此逻辑将适用于99%。重新编码的文件将如下所示

Email  Mail_id    Read_date
  a     1      12.jan
  b     1      12.jan
  c     1      12.jan
  a     2      14.jan
  b     2      14.jan
  c     2      14.jan
因此,对于已排序的表,我认为如果mail\u id中的first.read\u date和last.read\u date相同,则不执行任何操作,但如果它们不相同,则重新编码整个列read\u date=first.date。但我不知道如何在SAS中编码。有什么建议吗?

不要担心“什么都不做”;“什么都做”和“什么都不做”在同样的情况下没有什么不同

data want;
set have;
by mail_id;
retain sent_date;
if first.mail_id then sent_date=read_date;
read_date=sent_date;
drop sent_date;
run;

实际上,我建议将read_date保留为实际的read_date,而使用sent_date作为单独的字段,因为实际上这两个字段是不同的。只需删除最后两行(除了
run;
)就可以了。

从技术上讲,您还可以使用一个快速sql语句来合并原始表和一个子查询,该子查询将每个读取日期的最小日期作为发送日期,但这可能比首先使用
要慢。
last。
是的,我考虑过了,但考虑到前面/最后提到的OP,我决定坚持他/她所想的。@Joe-谢谢。但是这段代码为每个邮件id的第一个观察值提供了一个值,但为邮件id中的其他观察值提供了一个值。我正在考虑用第一个日期填充邮件id中的列。我试图添加“else sent_date=first.sent.date,但结果仅为0.Hmmm.Oops,我输入错误。Retain应该是
sent_date
而不是
read_date
;已更正。我应该能够看到。谢谢。