應該是一個我無法回答的簡單問題。我得到了一些調查資料,其中有幾個問題允許“選擇盡可能多的適用”。對于這些問題,回應選項存盤為以逗號分隔的單個變數。
例如,假設問題 1 (Q1) 有 9 個不同的回應選項。對于該問題,第 1 個人可能有三個回應存盤為:1、3、10,而第 2 個人可能有四個回應存盤為:2、3、8、9。
從這個單一變數 (Q1),我想創建 9 個單獨的變數,一個用于每個回應選項(Q1_1 到 Q1_9)。我相信我可以在一個 DATA 步驟中使用一個 ARRAY 和一個 DO 回圈來做到這一點,但是 INDEX 或 IN 函式都不起作用。下面是我一直在使用的代碼。
DATA Final; SET Final;
ARRAY Q1b{9} Q1_1 - Q1_9; *new variables I want to create;
DO i = 1 TO 9;
IF NOT MISSING(Q1) THEN Q1b{i} = 0; *works;
IF INDEX(Q1,"i") THEN Q1b{i} = 1; *Doesn't work;
IF Q1 IN: ("i") THEN Q1b{i} = 1; *Doesn't work either;
END;
RUN;
使用上面示例人員的回應,第 1 個人的 Q1_1 值為 1,而第 2 個人的值為 0。同樣,第 1 個人的 Q1_2 值為 0,而第 2 個人的值為 1。我猜它與SAS如何存盤回圈i有關(我認為它類似于沒有&的宏變數)。思想贊賞。
謝謝,瑞安
uj5u.com熱心網友回復:
INDEX() 需要字串。
IF INDEX(Q1,cats(i)) THEN Q1b{i} = 1;
請注意,如果有超過 9 個可能的回應,則不會縮放,因為數字“1”將同時出現在“1”和“10”中。因此,您可能想改用 INDEXW()。確保在逗號之外包含空格作為分隔符,以防止尾隨空格或逗號周圍的空格成為字串中單詞的一部分。
IF INDEXW(Q1,cats(i),' ,') THEN Q1b{i} = 1;
布爾運算式的計算結果為 0 或 1。因此您的程式可能只是:
data WANT;
set HAVE;
array q1_ [9] ;
do i = 1 to dim(q1_);
q1_[i] = 0<indexw(q1,cats(i),' ,');
end;
run;
uj5u.com熱心網友回復:
- 一般不應使用相同的輸入和輸出資料集名稱。使除錯變得困難,有時您會得到意外的輸出。
- 在回圈之前檢查變數是否為空,以避免不必要的回圈
- 從 i 中洗掉引號以使用數字 i。在引號中它正在尋找字母 i,而不是迭代器變數 i。
可能是這樣的:
DATA Final_expanded; /*1*/
SET Final;
ARRAY Q1b{9} Q1_1 - Q1_9; *new variables I want to create;
if not missing(q1) then DO i = 1 TO 9; /*2*/
IF INDEX(Q1, i) THEN Q1b{i} = 1; /*3*/
END;
RUN;
編輯:由于某種原因無法讓它作業,但這種方法確實有效。
DATA Final_expanded; /*1*/
SET have;
ARRAY Q1b{9} Q1_1 - Q1_9; *new variables I want to create;
nwords = countw(q1);
if not missing(q1) then DO i = 1 TO nwords; /*2*/
index = scan(q1, i);
q1b(index) = 1;
END;
RUN;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/468593.html
上一篇:For回圈不同的excel檔案和不同的作業表(Matlab)
下一篇:C++ 不使用虛析構的后果及分析