求SAS代码:计算含跨午夜时段的就寝时间标准差(附R实现代码)
对应需求的SAS实现代码
以下是实现你需求的SAS代码,逻辑和你提供的R代码完全对齐,解决午夜后就寝时间的处理问题:
/* 创建示例数据集,模拟就寝/起床时间数据 */ data sleep_data; input sleep_time TIME8. wake_time TIME8.; format sleep_time wake_time TIME8.; datalines; 23:30:00 05:30:00 00:00:00 05:30:00 00:30:00 05:35:00 ; run; /* 处理跨午夜的就寝时间:若就寝时间早于起床时间,视为前一天的时间,加上一天的秒数(24*3600) */ data sleep_adjust; set sleep_data; if sleep_time < wake_time then sleep_adjust = sleep_time + 24*3600; else sleep_adjust = sleep_time; /* 将调整后的时间转成分钟数,用于后续标准差计算 */ sleep_minutes = sleep_adjust / 60; format sleep_adjust TIME8.; run; /* 计算起床时间均值、原始就寝时间均值 */ proc means data=sleep_data mean noprint; var sleep_time wake_time; output out=mean_stats mean=mean_sleep mean_wake; run; data mean_display; set mean_stats; format mean_sleep mean_wake TIME8.; put "原始就寝时间均值: " mean_sleep; put "起床时间均值: " mean_wake; run; /* 计算调整后就寝时间的均值 */ proc means data=sleep_adjust mean noprint; var sleep_adjust; output out=adjust_mean mean=mean_sleep_adjust; run; data adjust_mean_display; set adjust_mean; /* 对均值取模24小时,得到符合日常格式的时间结果 */ mean_sleep_final = mod(mean_sleep_adjust, 24*3600); format mean_sleep_final TIME8.; put "调整后就寝时间均值: " mean_sleep_final; run; /* 计算就寝时间分钟数的标准差 */ proc means data=sleep_adjust std noprint; var sleep_minutes; output out=sd_stats std=sleep_sd_minutes; run; data sd_display; set sd_stats; put "就寝时间分钟数的标准差: " sleep_sd_minutes; run;
关键逻辑说明
- SAS中时间以秒为存储单位,处理跨午夜时间时,给早于起床时间的就寝时间加上
24*3600(一天的秒数),和R中sleep+1(chron包中times是0-1的日比例)逻辑完全匹配。 - 转换为分钟数时,只需将调整后的时间秒数除以60即可。
- 调整后就寝时间的均值可能超过24小时,用
mod函数取模24小时,得到符合日常认知的时间表示。
内容的提问来源于stack exchange,提问作者user23492854
相关产品推荐
相关产品推荐

