2016-05-31 145 views
1

我來自Python/R/Stata背景下的SAS,並瞭解到SAS中的情況有所不同。從其中一種語言的角度來看,我正在接近以下問題,也許SAS不能達到我想要的。使用for循環將列添加到SAS中的數據集

我有一個面板數據集,其中有一個age列。我想使用這個age列將新列添加到數據集。我將簡化age的功能,以便在我的示例中保持簡單。

目標是循環一個序列,並在每個循環步驟中使用該序列的值來指定新列的名稱並分配該列的值。我希望能得到我的出發數據集,用新的列添加到它取值spline1spline2 ... spline7

data somePath.FinalDataset; 

    do i = 1 to 7; 

     if i = 1 then 
     spline&i. = age; 

     if i ^= 1 then spline&i. = age + i; 

    end; 
    set somePath.StartingDataset; 
    run; 

此代碼將不能運行,但在早期版本中我能得到它運行,但是新的列已經將它們的值從它們本來應該的位置向下移動了一行。我將這個代碼塊包含爲我想要做的事情的僞代碼。任何幫助非常感謝

+0

你打算循環什麼?列(7)的數量是固定的還是動態的?我認爲你需要一個數組。 – Reeza

+1

您需要發佈示例輸入和輸出數據,以便我們能夠理解您想要執行的操作。第一個明顯的問題是,您在閱讀數據之前試圖操縱數據。將SET語句移到其他語句的上方,以便AGE有一些代碼供您操作。 – Tom

回答

4

在SAS中執行此操作的一種方法是使用數組。一個SAS數組可以用來引用一組變量,並且它也可以創建變量。

data have; 
    input age; 
    cards; 
    5 
    10 
; 
run; 

data want; 
    set have; 
    array spline{7}; *create spline1 spline2 ... spline7; 
    do i=1 to 7; 
    if i = 1 then spline{i} = age; 
    else spline{i} = age + i; 
    end; 
    drop i; 
run; 

樣條曲線{i}參照名爲樣條曲線的數組的第i個變量。
我是一個常規變量,DROP語句阻止它被寫入輸出數據集。

當你說新列被「移位一」時,請注意spline1 = age,spline2 = age + 2。您可以相應地更改您的代碼,例如如果你想spline2 = age + 1,你可以將你的else語句更改爲else spline{i} = age + i - 1 ;也可以更改數組語句,使用0作爲下限而不是1來定義它。

+0

我也許會在這個回答中提到SAS數組與其他編程語言中的數組有些不同(因爲它們只是變量的定義組,而不是單獨的變量/對象本身)。 – Joe

+0

@Joe請隨意編輯以添加該信息(我不太瞭解其他語言的智能評論:) – Quentin

+0

賓果,這解決了問題。謝謝你,先生 – JPErwin

0

數組可能是最好的方法解決這個問題,但我會演示一個宏觀的方法,這在某些情況下是必要的。

SAS將其處理數據語言從其編寫代碼語言分離爲「數據步驟語言」和「宏語言」。由於在執行階段(處理數據行時)運行數據步驟語言,而編譯階段(處理任何數據之前)運行的宏語言運行,因此它們在數據步驟中並不真正相互交談。

無論如何,對於這樣的事情來說,編寫一個宏來做你想做的事情是完全可能的。借用昆汀的一般結構和初始數據集:

data have; 
    input age; 
    cards; 
    5 
    10 
; 
run; 

%macro make_spline(var=, count=); 
    %local i; 
    %do i = 1 %to &count; 
    %if &i=1 %then &var.&i. = &var.; 
    %else &var.&i. = &var. + &i.; 
    ; *this semicolon ends the assignment statement; 
    %end; 

    /* You end up with the IF statement generating: 
     age1 = age 
    and the extra semicolon after the if/else generates the ; for that line, making it 
     age1 = age; 
    etc. for the other lines. 
    */ 
%mend make_spline; 


data want; 
    set have; 
    %make_spline(var=age,count=7); 
run; 

然後,這將執行您要執行的操作。循環使用宏語言,而不是數據步驟。無論您認爲合適,您都可以分配參數;我更喜歡上面的參數,甚至更多(開始循環也可以是一個參數,實際上分配代碼可能是一個參數!)。

相關問題