2015-09-15 69 views
2

好的,所以我有一個客戶ID和一個會話ID。對於多個重複會話ID的第一個,我有一個客戶ID,但對於後面的我不。我需要將我已下達的客戶ID複製到同一會話中的其他空白處。我的代碼嘗試如下:複製一個變量從第一個變量到最後一個變量的觀察

proc sort data=weblogsnew1; 
by session_id descending customer_id; 
run; 

data weblogsnew2; 
set weblogsnew1; 
by session_id descending customer_id; 
if first.session_id then do until(last.session_id); 
customer_id=first.customer_id; 
end; 
run; 

此代碼旋轉不休,但沒有任何反應?我可能需要做一些DOW循環,但我是一個相對的初學者,它讓我困惑,所以我希望有人能給我一些方向。

SESSION_ID ............. CUSTOMER_ID
1442103120308 ..... f8d63284bc0b463a93c588fef719bee0
1442103120308 ..... 0
1442103120308 ..... 0
1442103120308。 .... 0
1442103120308 ..... 0
1442103120308 ..... 0
1442103120308 ..... 0
1442103202937 ..... 4f13e0aebdda4811834285efe9543446
1442103202937 ..... 4f13e0aebdda4811834285efe9543446
1442103202937 ..... 4f13e0aebdda4811834285efe9543446
1442103202937 ..... 4f13e0aebdda4811834285efe9543446
1442103202937 ..... 4f13e0aebdda4811834285efe9543446
1442103202937 ..... 0
1442103202937 ..... 0
1442103202937 .. ... 0
1442103202937 ..... 0
1442103202937 ..... 0
1442103202937 ..... 0
1424466798849 ..... 0
1424466798849 ... .. 0
1424466798849 ..... 0

在某些情況下,我只有0的,所以只使用retain語句不起作用。

因爲我在格式化方面很糟糕,所以只是打破了兩列。

+0

可能重複(http://stackoverflow.com/questions/ 30642482/an-efficient-way-to-copying-values-in-subsequent-records-sas) – Reeza

+0

從我所瞭解的你不需要循環,你需要一個RETAIN。如果這不正確,請發佈一些示例數據以幫助澄清您的問題。 – Reeza

+0

發送的鏈接@Reeza中的retain語句不起作用,因爲在某些情況下,永遠不會有customer_id(即只有0),並且在這種情況下,以前的customer_id會被保留到新的會話中。 我需要customer_id由session_id決定,包括它們都是0的情況。 –

回答

1

我會認爲像這樣的工作:

data session; 
    infile cards firstobs=2; 
    input session_id :$13. dots $ Customer_id :$32.; 
    drop dots; 
    cards; 
Session_id ............. Customer_id 
1442103120308 ..... f8d63284bc0b463a93c588fef719bee0 
1442103120308 ..... 0 
1442103120308 ..... 0 
1442103120308 ..... 0 
1442103120308 ..... 0 
1442103120308 ..... 0 
1442103120308 ..... 0 
1442103202937 ..... 4f13e0aebdda4811834285efe9543446 
1442103202937 ..... 4f13e0aebdda4811834285efe9543446 
1442103202937 ..... 4f13e0aebdda4811834285efe9543446 
1442103202937 ..... 4f13e0aebdda4811834285efe9543446 
1442103202937 ..... 4f13e0aebdda4811834285efe9543446 
1442103202937 ..... 0 
1442103202937 ..... 0 
1442103202937 ..... 0 
1442103202937 ..... 0 
1442103202937 ..... 0 
1442103202937 ..... 0 
1424466798849 ..... 0 
1424466798849 ..... 0 
1424466798849 ..... 0 
;;;; 
    run; 

data want; 
set session(rename=customer_id=old_customer_id); 
by session_id notsorted; 
retain customer_id; 
if first.session_id then customer_id=old_customer_id; 
run; 
的[一個有效的方式來複制在隨後記錄的值 - SAS]
+0

這可行。謝謝! –

0

這是無限循環,除非碰巧只有一個session_id觀察。

if first.session_id then do until(last.session_id); 
customer_id=first.customer_id; 
end; 

陶氏擁有DO內設置直到(LAST; END;代碼塊

這將是我更容易幫助,如果你表現出一定的樣本數據

而且第一。 .customer_id是一個布爾不是CUSTOMER_ID的價值。

+0

我在原始評論中添加了一個示例。謝謝! –

0

這是我會如何使用DOW做到這一點,對於LOCF。

修正了聲明省略和添加的呼叫丟失。

data session; 
    infile cards firstobs=2; 
    input session_id :$13. dots $ Customer_id :$32.; 
    drop dots; 
    cards; 
Session_id ............. Customer_id 
1442103120308 ..... f8d63284bc0b463a93c588fef719bee0 
1442103120308 ..... 0 
1442103120308 ..... 0 
1442103120308 ..... 0 
1442103120308 ..... 0 
1442103120308 ..... 0 
1442103120308 ..... 0 
1442103202937 ..... 4f13e0aebdda4811834285efe9543446 
1442103202937 ..... 4f13e0aebdda4811834285efe9543446 
1442103202937 ..... 4f13e0aebdda4811834285efe9543446 
1442103202937 ..... 4f13e0aebdda4811834285efe9543446 
1442103202937 ..... 4f13e0aebdda4811834285efe9543446 
1442103202937 ..... 0 
1442103202937 ..... 0 
1442103202937 ..... 0 
1442103202937 ..... 0 
1442103202937 ..... 0 
1442103202937 ..... 0 
1424466798849 ..... 0 
1424466798849 ..... 0 
1424466798849 ..... 0 
;;;; 
    run; 
proc print; 
    run; 
data locf; 
    if 0 then set session; 
    do until(last.session_id); 
     set session(rename=(Customer_id=xcust)); 
     by session_id notsorted; 
     if xcust ne '0' then Customer_id = xcust; 
     output; 
     end; 
    call missing(of Customer_id); 
    drop xcust; 
    run; 
proc print; 
    run; 
+0

這工作,並沒有工作。我應該包含在我顯示的原始數據集中,在某些情況下,附加到會話標識的客戶ID全部爲0。在這種情況下,您編寫的代碼保留最後一個已知的客戶ID並將其提供給所有0。我現在在我的原始問題中包含了幾個只有0個觀察值的數據集。 –

+0

現在應該很好。我省略了所有重要的BY語句,並且我們還需要CALL MISSING for CUSTOMER_ID,因爲我將它從會話中複製到IF 0然後設置... –