1

文字列を数値変数に変換し、各文字の値を合計して、そのフィールドの一意の識別子として使用しようとしています。たとえば、A=1、B=2、C=3.....X=24 Y=25 Z=26 とします。私の文字列が「CAB」だとすると、コードを実行した後、結果を数値の中間列にしたいと思います。ここで、CAB の値は 3 1 2 であり、結果列は文字列 3+1+2 を合計することによって得られます。 = 6 となり、中間列の値が表示されるため、最終的な値は 6 になります。

文字を数値に変換するために使用した sas コードを次に示しますが、結果列について助けが必要です。

DATA CHAR_VALUE;
SET WORK.XYZ;
CHAR_2_NUM=TRANSLATE(MY_VAR_CHAR, '1 2 3 ...24 25 26', 'A B C ...X Y Z');
NUM_CHAR=INPUT(CHAR_2_NUM,32.);
RUN;

前もって感謝します...助けや提案をいただければ幸いです。-レイチェル

4

3 に答える 3

2

RANKは、文字の基礎となるASCII数値を提供します。したがって、A = 65、B = 66、Z = 90、a = 97、z=122です。

したがって、これは機能するはずです(大文字の値のみが必要な場合、A以外の値は異なりません)。

data test;
charval='CAB';
do _t=1 to length(Charval);
    numval=sum(numval,rank(char(upcase(charval),_t))-64);
end;
put _all_;
run;

別のオプション(以下のコメントに基づく)は、文字と値の関係を使用して情報を作成することです。私のループは各文字AからZを繰り返し、各文字に必要な値をラベルとして配置できます(1、2、3、4を配置するだけですが、label =はそれを変更します)。

data fmts;
retain fmtname 'CHARNUM' type 'i';
do _t=65 to 90;
start=byte(_t); *the character, so byte(65)='A';
label=_t-64;    *the resulting number;
output;
end;
run;
proc format cntlin=fmts;
quit;

data test;
charval='CAB';
do _t=1 to length(Charval);
    numval=sum(numval,input(char(upcase(charval),_t),CHARNUM.));
end;
put _all_;
run;

最後に、これを同じデータステップで作成できるようにする場合は、ハッシュテーブルで関係を作成し、結果を検索できます。必要に応じて説明できますが、文字とそのコードの関係を定義するという観点から、あなたがやりたいことのより詳細な例を見たいと思います。

中間値を確認する必要がある場合は、ループにCAT関数を挿入することで確認できます。CATXをお勧めします。

data test;
charval='CAB';
format intermed $100.;
   do _t=1 to length(Charval);
        numval=sum(numval,input(char(upcase(charval),_t),CHARNUM.));
        intermed=catx('|',intermed,input(char(upcase(charval),_t),CHARNUM.)); *or the RANK portion from earlier;
    end;


put _all_;
run;

それはあなたに与えるでしょう3|1|2、そしてあなたはそれからSCANを介して数学をすることができます:

do _t = 1 to countc(intermed,'|')+1;
  numval2 = sum(numval2,scan(intermed,_t,'|'));
end;
于 2012-12-07T16:56:52.460 に答える
0

試して翻訳するあなたの方法は良い試みですが、実際にはうまくいきません. これが簡単な解決策です:

DATA CHAR_VALUE;
  retain all_chars 'ABCDEFGHIJKLMMOPQRSTUVXXYZ';
  set XYZ;

  length CHAR_2_NUM $200;
  CHAR_2_NUM = ' ';
  NUM_CHAR = 0;

  do i=1 to length(MY_VAR_CHAR);
     if i=1 then CHAR_2_NUM = substr(MY_VAR_CHAR,i,1);
            else CHAR_2_NUM = trim(CHAR_2_NUM) || ' ' || substr(MY_VAR_CHAR,i,1);
     NUM_CHAR + index(all_chars,substr(MY_VAR_CHAR,i,1));
     end;
  drop i all_chars;
RUN;

all_charsこれは、変数内のソース変数の各文字のインデックス付き位置が、必要なマッピングに対応するという事実を利用しています。

CHAR_2_NUM元の質問で見落としていた変数も作成するように更新しました。

于 2012-12-07T18:55:30.680 に答える