基于SAS实现两个排序文件的记录合并与拆分计算求助
解决SAS按时间段占比拆分工时数据的问题
核心思路
- 先算出File1中每个雇主(COD)的总覆盖月份数,再得到单条时间记录的月份占比
- 通过
MERGE按COD关联两个已排序数据集,用占比拆分File2的工时类字段
具体实现步骤
1. 给File1添加月份占比字段
先处理File1,计算每条记录的时长(月份数),以及同一COD下的总月份数、单条记录的占比:
/* 计算单条记录月份数、同一COD总月份数及占比 */ data file1_with_ratio; set file1; by COD; /* 计算当前记录覆盖的月份数(包含起止月) */ months = intck('month', Start, End) + 1; /* 累加同一COD的总月份数 */ retain total_months; if first.COD then total_months = 0; total_months + months; /* 计算该记录的时间占比 */ ratio = months / total_months; run;
2. 关联File2并拆分工时
利用两个数据集已按COD排序的特性,直接MERGE关联,用占比计算拆分后的工时:
/* 合并数据集并计算拆分后的工时 */ data file3; merge file1_with_ratio(in=a) file2(in=b); by COD; if a and b; /* 仅保留两边都匹配到的记录 */ /* 按占比拆分工时字段 */ split_hours_work = hours_of_work * ratio; split_hours_vacancies = hours_of_vacancies * ratio; /* 保留需要输出的字段 */ keep COD Start End split_hours_work split_hours_vacancies; run;
3. 验证拆分准确性
可以通过对比同一COD的拆分后总和与原File2数值,验证计算是否正确:
/* 计算拆分后的总和 */ proc summary data=file3 nway; class COD; var split_hours_work split_hours_vacancies; output out=check_sum sum=total_work total_vac; run; /* 对比原数据与拆分总和 */ proc compare base=file2 compare=check_sum; by COD; var hours_of_work hours_of_vacancies; with total_work total_vac; run;
关键细节说明
intck('month', Start, End):计算两个日期的月份间隔,加1是因为要包含起始月份(比如1月到5月实际是5个月,intck返回4,加1才对)by COD+first.COD:实现按雇主分组,累加总月份数in=a/in=b:过滤掉仅在一个数据集中存在的雇主,避免不匹配的无效记录
内容的提问来源于stack exchange,提问作者NewUsr_stat
相关产品推荐
相关产品推荐

