2017-07-06 63 views
0

我想在SAS DI中構建自定義轉換。這種轉換將對輸入數據集中的列「起作用」,產生所需的輸出。爲了簡單起見,我們假設轉換將使用input_col1來計算output_col1input_col2來計算output_col2,依此類推直到指定的列數(例如2)。如何在SAS中動態選擇索引賦值變量?

代碼選項部分自定義轉換用戶能夠指定(通過提示)要對其執行操作的列的名稱;例如,用戶可以指定input_col1應該引用輸入數據集中名爲「order_datetime」的列,併爲input_col2制定類似的規範,否則將該提示留空。

這裏是我用來生成自定義轉換的輸出代碼:

data cust_trans; 
    set &_INPUT0; 

    i=1; 
    do while(i<3); 
     call symputx('index',i); 
     result = myfunc("&&input_col&index"); 
     output_col&index = result; /*what is proper syntax here?*/ 
     i = i+1; 
    end; 
run; 

這裏myfunc指的是我使用PROC鈣鎂磷肥的正常工作取得了自定義的功能。

自定義轉換工作正常,如果我不嘗試考慮變量數量的輸入欄的作用於(即,如果我用"&&input_col&i",而不是"&&input_col&index",只是使用在輸出表中的列result)。

不過,我在與試圖使這種方法更具活力的兩個問題:

  • 我得到包含線以下警告 result = myfunc("&&input_col&index")

    警告:表觀象徵參考INDEX未解決。

  • 我不知道如何分配到所需的輸出列動態發生;即,取決於do循環的迭代,我希望將輸出值分配給相應的輸出列。

我覺得這個解決方案必須在專家中衆所周知,但我找不到任何解釋如何做到這一點的解釋。

任何幫助,非常感謝!

回答

1

以這種方式,您不能使用依賴於數據變量的宏變量。宏變量在編譯時解析,而不是在運行時解析。

所以,你要麼必須

%do i = 1 %to .. ; 

,如果你在一個宏(它不會實際宏以外工作),或者你需要使用一個數組這是罰款。

data cust_trans; 
    set &_INPUT0; 
    array in[2] &input_col1 &input_col2; *or however you determine the input columns; 
    array output_col[2]; *automatically names the results; 
    do i = 1 to dim(in); 
     result = myfunc(in[i]); *You quote the input - I cannot see what your function is doing, but it is probably wrong to do so; 
     output_col[i] = result; /*what is proper syntax here?*/ 
    end; 
run; 

這就是您通常那樣做的方式。我不知道myfunc是幹什麼的,我也不知道你爲什麼在傳遞給它時引用了"&&input_col&index.",但這將是一種奇怪的操作方式,除非你想將輸入列的名稱作爲文本(並且不要不想知道該變量中的數據)。如果這樣做,則通過vname(in[i]),它將變量的名稱作爲字符傳遞。

+0

感謝@Joe提供了非常及時和徹底的答案。這解決了我的問題。至於關於將名稱傳遞給過程的問題,這部分是爲這個問題製作一個最小工作示例的人工製品,部分原因是該過程確實需要表名和列名。不重要。再次,非常感謝! – Rookatu