SAS中日期之间的差异与结果不一致

编程语言 2026-07-09

我需要在R 中重新实现SAS的代码,但我很难得到与原结果完全一致的结果。我能让某些行保持一致,但同时也有其他行不同。

有人能帮忙将下面的SAS代码等价地转换成R 代码吗?

data data_new;  
set data_old;  
months=intck('day30.5',date1,date2);  
run;

我已经尝试了这个但没有好运(month2_sas是 SAS的结果):

test_data <- data.frame(
  months2_sas = c(5, -2, -8, 10, 4, 7, -8, -7, -2, 2, 7, -7, -8, -11, -9, -8, 0, 11, 0, -2, -1, 7, -4, 7, -6, 10, 6, 9),
  date1 = as.Date(c("2021-06-16","2021-06-16","2020-09-23","2020-09-23","2020-09-23","2022-05-05","2022-03-10","2022-03-10","2022-03-10","2022-03-10","2022-03-10","2022-03-16","2020-02-04","2017-10-28","2017-10-28","2017-10-28","2017-10-28","2017-10-28","2017-10-28","2017-10-28","2017-10-28","2017-10-28","2017-04-28","2017-04-28","2020-10-31","2020-10-31","2023-06-22","2023-06-22")),
  date2 = as.Date(c("2021-12-03","2021-05-05","2020-02-10","2021-08-11","2021-02-09","2022-11-15","2021-08-02","2021-09-07","2022-02-02","2022-06-07","2022-10-31","2021-08-30","2019-06-21","2016-11-08","2017-01-06","2017-02-10","2017-10-02","2018-09-03","2017-10-10","2017-08-08","2017-09-04","2018-04-30","2016-12-09","2017-11-09","2020-05-18","2021-08-13","2023-12-05","2024-03-05"))
)

sas_epoch <- as.Date("1960-01-01")

test_data %>%
  mutate(

    months_r = floor(as.numeric(date2 - sas_epoch) / 30.5) - 
      floor(as.numeric(date1 - sas_epoch) / 30.5)
  ) %>%
  select(  months2_sas,months_r)

解决方案

我同意评论中的观点:这段SAS代码可能并不是按你想要的方式工作。具体来说,根据文档,这段代码是在计算自SAS纪元1960-01-01起,偏移量为5 的30天增量的数量。

不过,要数值上重现其实很容易:

## These are the 'ticks' we'll have to count (from 05-Jan since shift +5)
##  Could calculate this in a smarter way... this'll cover till early 2042
sas_intervals <- as.Date("1960-01-05") + (0:1E3)*30

my_function <- \(date1, date2) {
   mapply(\(d1, d2) {
      if (d1 > d2) {
         -1 * sum(d2 < sas_intervals & sas_intervals <= d1)
      } else sum(d1 < sas_intervals & sas_intervals <= d2)
   }, d1=date1, d2=date2, SIMPLIFY=TRUE, USE.NAMES=FALSE)
}

with(test_data, all.equal(my_function(date1, date2), months2_sas))
#> TRUE
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章