0

dataname というデータのサブセットに対して PROC FREQ を使用しようとしています。varname が「A.Never Used」と等しくないすべての行を含めたいと思います。次のコードがあります。

proc freq data=dataname(where=(varname NE 'A.Never Used')); 走る;

末尾または先頭の空白に問題があるのではないかと考えたので、次のことも試しました。

proc freq data=dataname(where=(strip(varname) NE 'A.Never Used')); 走る;

私の推測では、何らかの理由で文字列値が「A.Never Used」ではありませんが、データを印刷するたびに、これが表示される値になります。

4

1 に答える 1

2

これは、文字列データを扱う際の一般的な問題です (そうしないのには十分な理由があります!)。データのソースを考慮する必要があります。それは Web フォームからのものでしたか? 次に、通常のスペース ('20'x) ではなく、改行なしのスペース ('A0'x) が含まれている可能性があります。Unicode 環境から来たものですか (たとえば、日本語の文字は合法です)。次に、トランスコーディングの問題が発生する可能性があります。

これらの問題の大部分に有効ないくつかのオプション:

  1. アルファベット以外のすべてを圧縮します。where=(compress(varname,,'ka') ne 'ANeverUsed')例えば。「ka」は「キープのみ」と「アルファベット」を意味します。
  2. UPCASE または LOWCASE を使用して、大文字と小文字の問題が発生していないことを確認します。
  3. データ ステップで使用put varname HEX.;して、基になる文字を確認します。2 つの 16 進文字はそれぞれ 1 つのアルファベット文字です。 20スペースです(strip削除されます)。これを行う前に並べ替えて、この値が隣り合っていると思われるvarname行を簡単に確認できるようにします-違いは何ですか? おそらく特殊文字、マルチバイト文字、または誰が何を知っているかですが、ここで明らかにする必要があります。
于 2013-10-05T19:58:53.283 に答える