讓我們從您的示例輸出數據開始。
data expect ;
id+1;
length USERKEYED VALMATCH DEVICEVERIFIED EXCEPTION
USERREGISTRD ASSOCIATE EXTERNAL GROSSGIVEN UMAPPED $1 ;
input USERKEYED -- UMAPPED;
cards4;
Y N N N N Y N Y N
Y N N N N Y Y Y N
Y N N Y N Y N Y N
;;;;
現在我們可以重新創建你的榜樣輸入數據:
data have ;
do until (last.id);
set expect ;
by id ;
array flag _character_;
length string $200 ;
do _n_=1 to dim(flag);
string=catx(';',string,catx('=',vname(flag(_n_)),flag(_n_)));
end;
end;
keep id string;
run;
這將是這樣的:
USERKEYED=Y;VALMATCH=N;DEVICEVERIFIED=N;EXCEPTION=N;USERREGISTRD=N;ASSOCIATE=Y;EXTERNAL=N;GROSSGIVEN=Y;UMAPPED=N
USERKEYED=Y;VALMATCH=N;DEVICEVERIFIED=N;EXCEPTION=N;USERREGISTRD=N;ASSOCIATE=Y;EXTERNAL=Y;GROSSGIVEN=Y;UMAPPED=N
USERKEYED=Y;VALMATCH=N;DEVICEVERIFIED=N;EXCEPTION=Y;USERREGISTRD=N;ASSOCIATE=Y;EXTERNAL=N;GROSSGIVEN=Y;UMAPPED=N
所以處理這一點,我們需要從變量解析出對STRING
轉化爲多個觀察值,其中個體對的值分爲NAME
和VALUE
變量。
data middle ;
set have ;
do _n_=1 by 1 while(_n_=1 or scan(string,_n_,';')^=' ');
length name $32 ;
name = scan(scan(string,_n_,';'),1,'=');
value = scan(scan(string,_n_,';'),2,'=');
output;
end;
keep id name value ;
run;
然後我們可以使用PROC TRANSPOSE
將這些觀察值轉換成變量。
proc transpose data=middle out=want (drop=_name_) ;
by id;
id name ;
var value ;
run;
來源
2015-11-13 22:27:47
Tom
在數據中讀入第一個變量作爲變量,第二個變量作爲值讀取。然後轉置數據。 – Reeza
數據集中或文本文件中的字符變量中的字符串是否需要讀取?如果它是在一個文本文件中,那麼也許你可以使用命名輸入樣式來閱讀。但是你需要知道變量名才能寫入輸入語句。 – Tom
謝謝你的回覆。現在我嘗試了字符串函數,它工作正常。儘管它正在工作,但是對於我來說代碼看起來並不令人滿意,如果將更多標誌添加到列中,它需要更改代碼。 –