0

データベース内の変数名が説明的であり、連続番号が付けられていない調査データを扱っています。これらはデータベース内で連続しています (左から右へ)。番号付き変数を使用してプログラムで作業したいのですが、すべての変更を手動で書き出さなくてもプログラムで名前を変更しようとして失敗しました (合計 8​​7 個の変数があります)。

を使用しようとしましarrayたが、順番に名前が付けられておらず、共通の構造を持っていない (共通のプレフィックスやサフィックスがない) ため、うまくいきませんでした。

例のデータは次のとおりです。


data svy;
  input id relationship outburst checkwork goodideas ;
cards;
101 3 4 5 6
102 4 5 6 6
103 1 1 8 1
104 2 3 2 4
;
run;

*****  does not work  ;
data svy_1; set svy;
rename relationship--goodideas = var01--var04;
run;
quit;

上記のコードは、ログに次のエラーを返します。

ERROR: Missing numeric suffix on a numbered variable list (relationship-goodideas).

変数の名前を var01、var02 などに変更したいと思います。

どんな助けでも大歓迎です。

4

2 に答える 2

1

同僚が最善のアプローチを思いついた:


*****  does work ;

data svy_1;
set svy;
array old { 4 } relationship--goodideas;
array var { 4 } ;

do i = 1 to 4;
var[i] = old[i];
end;
drop i;
run;

于 2013-02-14T21:16:58.490 に答える
1

いくつかのこと:

データ ステップ #2 は正しくありません。set ステートメントがありません。また、'quit' は必要ありません。quit は、PROC SQL、PROC FORMAT、PROC DATASETS など、一般に「プログラミング環境」である特定の PROC に対してのみ行われます。害はありませんが、奇妙に見えます:)

データセット内の順次変数リストは二重ダッシュです。したがって、これらを使用して簡単に配列を作成できます。

array myvars relationship--goodideas;

したがって、それで十分である場合 (名前の変更なし)、それを選択してください。本当にそれらの名前を変更したい場合(変数名の意味が取り除かれ、コードが読みにくくなるため、少し悪い考えです。ただし、名前を変更したい理由は理解しています)、使用できません残念ながら、これは正しいのですが、RENAME ステートメントではサポートされていません。

82   *****  does not work  ;
83   data svy_1;
84   rename relationship--goodideas = var01-var04;
            ------------
            47
ERROR 47-185: Given form of variable list is not supported by RENAME. Statement is ignored.

85   run;

残念ながら、配列を使用して rename ステートメントを実行することはできません。だから、あなたは何か他のことをしなければならないでしょう。これが1つの答えです。

proc contents data=svy out=svy_vars(keep=name varnum) noprint;
run;

proc sort data=svy_vars; 
by varnum;
run;

data for_rename;
set svy_vars;
if name in ('relationship' 'outburst' 'checkwork' 'goodideas') then do;
  namectr+1;
  new_name=cats(name,'=','var',put(namectr,z2.));
  output;
end;
run;

proc sql;
select new_name into :renlist separated by ' ' from for_rename;
quit;

proc datasets nolist;
modify svy;
rename &renlist;
quit;

PROC SQL と DICTIONARY.COLUMNS テーブル、またはデータ ステップと SASHELP.VCOLUMN を使用して、より短い方法で同様のことを行うことができますが、proc コンテンツ メソッドは、何が起こっているかについてより透過的です。4 つ以上の変数がある場合は、その IN ステートメントを否定ステートメント (名前が (変更しないもののリスト) にない場合) に変更する方が簡単な場合、または VARNUM 変数自体を使用してどの変数を使用するかを決定することもできます。変更したい ((2:5) の varnum がそこで機能する場合)。

于 2013-02-14T15:39:45.813 に答える