[英]Using SAS or SQL find the first and last non-empty value within a row?
我的數據當前為以下形式:
ID Fill1 Fill2 Fill3 Fill4 Fill5
1 01JAN2014 28JAN2014 26FEB2014 . .
2 . 05FEB2012 03MAR2012 02APR2012 01MAY2012
3 10MAR2015 08APR2015 07MAY2015 05JUN2015 03JUL2015
4 . . 20FEB2013 18MAR2013 .
我正在嘗試為每個ID創建治療“片段”。 換句話說,對於每個ID,我想查找第一個和最后一個非空填充,然后計算兩個日期之間的差。 例如對於ID = 1,我需要找到01JAN2014和26FEB2014之間的時差。 那是,
Fill1-Fill3 =情節持續時間
但是對於ID = 4,我需要找到
Fill3-Fill4 =情節持續時間
其中epipduration是創建的新變量。 我有超過30k的唯一ID,其中“開始”和“最后”填充日期各不相同。 在此先感謝您的幫助。
data have;
input Id Fill1 date9. Fill2 date9. Fill3 date9. Fill4 date9. Fill5 date9.;
format Fill1 - Fill5 date9.;
cards;
1 01JAN201428JAN201426FEB2014
2 05FEB201203MAR201202APR201201MAY2012
3 10MAR201508APR201507MAY201505JUN201503JUL2015
4 20FEB201318MAR2013
;
run;
data want;
set have;
array fill {5};
format first last date9.;
do i = 1 to dim(fill);
first=coalesce(first, fill(i));
last=coalesce(fill(i), last);
end;
episodeduration = last - first;
drop i;
run;
使用array
語句創建數組並遍歷變量和coalesce()
函數以查找第一個/最后一個非缺失的對象。
注釋:該代碼將通過從第一個到最后一個變量來查找第一個/最后一個。 如果您需要日期的第一位/最后一位,則min和max函數是不錯的選擇: min(of fill1 -- fill5);
-無需循環。
vasja的SAS版本看起來很不錯,這是在SQL方面可以做到的方式(幾乎完全相同的過程)。
Select *,
DATEDIFF(day,
CONVERT(date,COALESCE(date1, date2, date3, date4, date5)),
CONVERT(date, COALESCE(date5,date4,date3,date2,date1))
)
from SomeTableNameAboutEpisodes;
基本上,使用合並查找第一個非空值,然后將其轉換為日期。 然后,您可以計算兩個日期之間的差額。 但是,這僅在空單元格沒有值(空)並且沒有空行的情況下有效。 (不過,您可以簡單地放置一個ISNULL(DATEDIF(...),0) )。
您可以使用降序的“ SAS變量列表”(FILL5-FILL1)使其變得更容易。
data diff;
set have;
first = coalesce(of fill1-fill5);
i = whichn(first,of fill1-fill5);
last = coalesce(of fill5-fill1);
j = 6-whichn(last, of fill5-fill1);
format first last date9.;
run;
Obs Id Fill1 Fill2 Fill3 Fill4 Fill5 first i last j
1 1 01JAN2014 28JAN2014 26FEB2014 . . 01JAN2014 1 26FEB2014 3
2 2 . 05FEB2012 03MAR2012 02APR2012 01MAY2012 05FEB2012 2 01MAY2012 5
3 3 10MAR2015 08APR2015 07MAY2015 05JUN2015 03JUL2015 10MAR2015 1 03JUL2015 5
4 4 . . 20FEB2013 18MAR2013 . 20FEB2013 3 18MAR2013 4
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.