0

これは私の現在の問題です:

SAS データセットに、変更が必要な 53 個の可変ヘッダーがあります。たとえば、次のようになります。

Current_Week_0 TS   |    Current_Week_1 TS    |    Current_Week_2 TS  -- etc.

そのように変更する必要がありますCurrent_Week_# TS = Current_Week_# -- dropping the TS

次のようにループするなど、これを自動化する方法はありますか?

i = 0,53
Current_week_i TS = Current_Week_i  ?  

適切な構文がわかりません。

編集: 私のフォーマット Sergiu を編集していただきありがとうございます。:)

編集:

次のコードを使用しましたが、次のエラーが表示されます:
番号付き変数リストに数字のサフィックスがありません (TS-Current_Week_53)

     DATA True_Start_8;
        SET  True_Start_7;
          ARRAY oldnames (53) Current_Week_1 TS-Current_Week_53 TS;
          ARRAY newnames (53) Current_Week_1-Current_Week_53;
          DO i = 1 TO 53;
               newnames(i) = oldnames(i) ;
          END;
     RUN;

@ジョー編集

「denorm」/転置前後のデータは次のようになります。

Product     ID      CurrentWeek         Market  TS
X           75av2kz     Current_Week_0  Z       1
Y           7sav2kz     Current_Week_0  Z       1
X           752v2kz     Current_Week_1  Z       1
Y           255v2kz     Current_Week_1  Z       1


Product     ID      Market    Current_Week_0_TS    Current_Week_1_TS
X           75av2kz     Z         1                    0
Y           7sav2kz     Z         1                    1
X           752v2kz     Z         1                    1
Y           255v2kz     Z         1                    0
4

2 に答える 2

0

別のオプションは、転置でこれを行うことです。サンプルデータが目的の出力例と一致しないか、説明されていないロジックがありますが、これは単純な転置を行います。current_week_0/1 が以下のものと異なるという論理的な理由がある場合は、その理由を説明してください。

data have;
format currentWeek $20.;
input Product  $ ID  $ CurrentWeek $ Market $ TS;
datalines;
X           75av2kz     Current_Week_0  Z       1
Y           7sav2kz     Current_Week_0  Z       1
X           752v2kz     Current_Week_1  Z       1
Y           255v2kz     Current_Week_1  Z       1
;;;;
run;

proc sort data=have;
by market id product;
run;
proc transpose data=have out=want;
by market id product ;
id currentWeek;
var TS;
run;
于 2013-11-14T18:59:47.950 に答える
0

これはあまり難しくありません。これらは変数ラベルだと思います。

    proc sql;
    select cats('%relabel_nots(',name,')') into :relabellist separated by ' '
    from dictionary.columns
    where libname='WORK' and memname='True_Start_7'
    and name like '%TS';  *you may need to upper case the dataset name (memname) depending on your OS;
    quit;
%macro relabel_nots(name);
label &name.= substr(vlabel(&name.),1,length(vlabel(&name.))-3);
%mend relabel_nots;

data want;
set True_Start_7;
&relabellist.;
run;

基本的に、PROC SQL は、再ラベル付けに適したさまざまな名前を取得し、すべての名前変更マクロ呼び出しで大きなマクロ変数を生成します。relabel_nots マクロは新しいラベルを生成します。変数名に TS も含まれていない場合は、PROC SQL の WHERE の背後にあるロジックを変更する必要がある場合があります。

于 2013-11-14T16:28:46.893 に答える