我的数据是,
id date1 date1_flag date2 date2_flag date3 date3_flag
001 20020212 1
032 20061130 1
020 20060603 2
040 20041023 1
094 20090110 2
044 20040320 3
..并且有超过200,000个条目
我想拥有,
id date date_flag
001 20020212 1
032 20061130 1
020 20060603 2
040 20041023 1
094 20090110 2
044 20040320 3
基本上我想把所有日期变成一列,所有date_flags变成一列。
每个id只有一个日期(例如,id不能有date1和date2)。 我认为一开始会很容易,但我无法理解它。
答案 0 :(得分:0)
使用这样的合并函数:
proc sql;
create table NewTable as
select coalesce(date1, date2, date3) as date
, coalesce(date1_flag, date2_flag, date3_flag) as date_flag
from YourTable;
quit;
Coalesce将使用它找到的第一个值。因此,如果您确定每行只有一个日期/标记,那么这将起到作用。
答案 1 :(得分:0)
有很多解决方案......
您可以在数据步骤中使用数组函数执行此操作。你可以像Oliver建议的那样使用coalesce
来做。您也可以使用UNION执行此操作:
proc sql;
select id, date1 as date, 1 as date_flag
from YourTable
where date1~=.
union all
select id, date2 as date, 2 as date_flag
from YourTable
where date2~=.
union all
select id, date3 as date, 3 as date_flag
from YourTable
where date3~=.
quit;
或者,最后,你可以使用SQL case语句来做,但这可能是不必要的复杂,所以我不会进入它。
答案 2 :(得分:0)
正如其他人已经注意到有多种方法可以做到这一点。您可能希望在proc sql
中执行此操作,但我只是在使用条件语句的数据步骤循环中执行此操作。
data work.Temp (rename = (date1 = date date1_flag = date_flag));
input id date1 date1_flag date2 date2_flag date3 date3_flag;
if date2 NE . then date1 = date2;
if date3 NE . then date1 = date3;
if date2_flag NE . then date1_flag = date2_flag;
if date3_flag NE . then date1_flag = date3_flag;
drop date2 date2_flag date3 date3_flag;
datalines;
001 20020212 1 . . . .
032 20061130 1 . . . .
020 . . 20060603 2 . .
040 20041023 1 . . . .
094 . . 20090110 2 . .
044 . . . . 20040320 3
;
run;
proc print data=work.temp; run;
句号.
表示数据值为空/缺失。