我有一个需要转换为R的SAS代码。
我的SAS代码是这样的 -
proc sql;
create table data as
select a.*,b.qty from Sales as a inner join Units as b
on a.id=b.id and put(a.date,yymmn6.)=put(c.date,yymmn6.)
quit;
我知道put(a.date,yymmn6。)将日期转换为SAS日期值。但是a.date在这个功能之后变成了什么?如果date = 01jan2012,put(a.date,yymmn6。)将其设为某个代表201201或20120101的SAS值?即创建的SAS值是代表整个日期还是仅代表日期和日期?
目前,我正在为此编写R代码 -
data <- sqldf("select a.*,b.qty from Sales as a inner join Units as b
on a.id=b.id and a.date=c.date")
我应该这样做 -
Sales$date <- as.yearmon(Sales$date)
Units$date <- as.yearmon(Units$date)
data <- sqldf("select a.*,b.qty from Sales as a inner join Units as b
on a.id=b.id and a.date=c.date")
我无法访问SAS,因此,我无法对示例数据进行尝试。任何帮助都会很棒。谢谢!
答案 0 :(得分:1)
put(a.date,yymmn6。)将数字日期值转换为存储为yyyymm的字符值(例如201201)。因此,连接条件匹配月份和年份相同的所有日期,但不一定是日期。 我不确定在R中实现这一目标的最佳方法,但您似乎对此有一些想法。 希望这会有所帮助。
答案 1 :(得分:1)
使用put(a.date,yymmn6.)
时,该函数的输出是一个字符。 Put
采用数字输入并格式化并输出格式化的数值作为字符。 input
功能恰恰相反。
data mydata;
sas_numeric_date = "01jan2012"d;
sas_yyyymm_char_date = put(sas_numeric_date, yymmn6.);
sas_yyyymm_numeric_date = input(sas_yyyymm_char_date, yymmn6.);
output;
sas_numeric_date = "29Feb2012"d;
sas_yyyymm_char_date = put(sas_numeric_date, yymmn6.);
sas_yyyymm_numeric_date = input(sas_yyyymm_char_date, yymmn6.);
output;
format sas_numeric_date sas_yyyymm_numeric_date date9.;
run;
sas_numeric_date sas_yyyymm_char_date sas_yyyymm_numeric_date
01Jan2012 201201 01Jan2012
29Feb2012 201202 01Feb2012
因此,当您将yymmn6.
作为信息应用于sas_yyyymm_char_date(其本身为yyyymm
格式)时,结果值为数字,day
部分日期默认为第一天如上所示的月份。