Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date 在SAS中计算新变量时,为什么我的值会偏移?_Date_Sas - Fatal编程技术网

Date 在SAS中计算新变量时,为什么我的值会偏移?

Date 在SAS中计算新变量时,为什么我的值会偏移?,date,sas,Date,Sas,我试图使用SAS中的YEAR()函数从格式为MMDDYY10的日期中提取年份。但是,当我计算名为“year”的新列时,所有的值都偏移了一行 例如,我想要: Date Year 12/31/2014 2014 06/25/2007 2007 但我得到了: Date Year 12/31/2014 . 06/25/2007 2014 . 2007

我试图使用SAS中的YEAR()函数从格式为MMDDYY10的日期中提取年份。但是,当我计算名为“year”的新列时,所有的值都偏移了一行

例如,我想要:

    Date          Year

    12/31/2014       2014
    06/25/2007       2007 
但我得到了:

   Date         Year
  12/31/2014       . 
  06/25/2007      2014
     .           2007


 Data Clinic2;
   format datebp MMDDYY10.;
   year = YEAR(datebp);
   set Clinic; 
   run;

将其更改为下面的代码。您的set语句已从数据中排到第一位,必须读取数据才能进行计算。如果将变量保留在set语句之前,则新变量初始化将以缺少的值开始,然后读取set语句

 Data Clinic2;
  set Clinic;
   year = YEAR(datebp);
  run;
让我们尝试使用sashelp.class来理解。 变量初始化甚至在将数据读取为缺失值之前就已开始

/* wrong way*/
 data want;
age1 = age+5;
 set sashelp.class;
 run;
 /* correct way*/
data want;
set sashelp.class;
 age1 = age+5;
run;

即使在读取数据之后,变量初始化也已开始,并且未分配给缺少的值

/* wrong way*/
 data want;
age1 = age+5;
 set sashelp.class;
 run;
 /* correct way*/
data want;
set sashelp.class;
 age1 = age+5;
run;

语句的顺序很重要。您的程序正在计算年份,然后从数据集中读取DATEBP的值。由于YEAR不在源数据集中,因此SET语句不会更改YEAR的值

这就是为什么第一个观测值缺少年份值,但尚未读取DATEBP值的原因。年份的其余值没有丢失的原因是,SAS在开始数据步骤的下一次迭代之前,不会将来自输入数据集的变量重置为丢失。因此,对于第二次、第三次等迭代,您将根据上一次迭代读取的DATEBP值计算年份。然后用SET语句读取的当前观测值替换DATEBP的值