0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【SAS】変数の値が文字なのか数値なのか判定する

Last updated at Posted at 2021-01-24

先日、数値しか入ってこないと聞いていた変数に、のっぴきならない事情で文字が入っていた外部データ(csv)を扱う機会がありました。
文字が入っていた場合は例外対応をしたいな~と思い、その際に調べたことをまとめます。

前提

  • SAS 9.4
  • SAS/STAT 15.1

compress関数を使う

前置き:そもそもcompress関数て何????

SAS compress関数
公式ドキュメントによると、

元の文字から指定した文字を削除した文字列を返します。

とあります。

構文

compress(source <,characters>, modifier )
第2引数と第3引数は省略可能です。

例えば、ABCDEからABCを削除したい場合は

X='ABCDE';
Y=compress(X,'ABC');
putlog(Y) // DE

となります。

ABCのみを保持して後は削除することもできます。

X='ABCDE';
Y=compress(X,'ABC',k); // 第3引数にkを指定すると「削除」ではなく「保持」される
putlog(Y) // ABC

本題:文字or数値判定

compress関数が、元の文字から**指定した文字を削除(あるいは保持)**することを利用します。

例えば、
「0123abc456」という数値と文字が混ざっているものから、数値のみ削除する場合、

X='0123abc456';
Y=compress(X,'','kf'); //アンダースコア、英文字を保持 ※ [k]は保持、[f]はアンダースコア文字および英文字を表す
putlog(Y); // abc

X='0123456';
Y=compress(X,'','kf');
putlog(Y); // '' アンダースコア、英文字を保持(それ以外は削除)されるので空白''が返ってくる

使用例

以下のようなデータがあった場合
image.png
hogeが数値の場合と文字の場合で、格納変数を分ける。
※hogeは文字型で定義されているものとします。

// 数値と文字が混じったデータ
data A1;
	input hoge$;
	cards;
	0
	1
	2
	3
	4
	a
	b
	c
	;
run;

data A2;
	attrib num length=8;
	attrib char length=$20;
	set A1;
    // hogeに文字が含まれていればchar、含まれていなければnumに格納する
	if compress(hoge,'','kf') ^= '' then character=hoge; else number=hoge;

	keep num cha;
run;

実行結果

image.png

補足

compress関数の第2引数と第3引数には変数、式、固定値を指定することができます。詳細は公式ドキュメントをご参照いただければと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?