簡體   English   中英

如何使用 SAS 從特定 ROW 中獲取第一個和最后一個 MISSING 值

[英]How can I get the first and the last MISSING value from a particular ROW using SAS

有以下問題,我想確定一行中的第一個和最后一個缺失值。 以下面的代碼為例:

data example;
  input id var1 var2 var3 var4 var5 var6 var7 var8 var9 var10 var11 var12;
cards;

A   1 2 3 . . . . . 1 1 1 3
B   3 3 2 1 3 2 1 . . . . .
C   . . . . 1 2 3 1 2 3 2 .
D   3 . 1 . 3 . 1 . 3 . 1 .
F   1 3 . . 1 3 . . 1 3 . .
E   3 2 1 . . . . . 1 1 1 3
G   3 3 2 1 3 2 1 . . . . .
H   . . . . . 1 2 3 1 2 3 2
I   3 . 1 . 3 . 1 . 3 . 1 .
J   A E . . A E . . A E . . 
;

在 A 行中,第一個是 var4,最后一個是 var8

在 D 行,第一個是 var2,最后一個是 var12

謝謝你。

使用 ARRAY 和幾個 DO 循環似乎很簡單。

讓我們清理您的數據步驟並添加一個沒有缺失值的示例。

missing abcdefghijklmnopqrstuvwxyz;
data example;
  input id $ var1-var12;
cards;
A   1 2 3 . . . . . 1 1 1 3
B   3 3 2 1 3 2 1 . . . . .
C   . . . . 1 2 3 1 2 3 2 .
D   3 . 1 . 3 . 1 . 3 . 1 .
F   1 3 . . 1 3 . . 1 3 . .
E   3 2 1 . . . . . 1 1 1 3
G   3 3 2 1 3 2 1 . . . . .
H   . . . . . 1 2 3 1 2 3 2
I   3 . 1 . 3 . 1 . 3 . 1 .
J   A E . . A E . . A E . . 
K   1 2 3 4 5 6 7 8 9 10 11 12
;

因此,然后在數據步驟中創建要檢查的變量的數組(按照您希望檢查的順序)。 然后使用兩個 do 循環。 計數時,請確保在沒有找到的情況下捕獲案例。 默認情況下,結果將為 N+1,所以也許您希望它確實為零,而不是像倒計時時得到的結果。

data want;
  set example;
  array vars var1-var12;
  do first=1 to 12 while(not missing(vars[first])); end;
  if first>12 then first=0;
  do last=12 to 1 by -1 while(not missing(vars[last])); end;
run;

結果;

在此處輸入圖片說明

將所有值連接到一個字符串中。 找到第一個的位置. 最后. 在字符串中。

data want;
    set example;

    sequence_char = cats(of var1-var12);

    missing_start = find(sequence_char, '.');
    missing_end   = length(sequence_char) - find(strip(reverse(sequence_char)), '.') + 1;
    
run;

輸出:

id  sequence_char   missing_start   missing_end
A   123.....1113    4               8
B   3321321.....    8               12
C   ....1231232.    1               12
D   3.1.3.1.3.1.    2               12
F   13..13..13..    3               12
E   321.....1113    4               8
G   3321321.....    8               12
H   .....1231232    1               5
I   3.1.3.1.3.1.    2               12
J   ............    1               12

我在這里假設這些字母不應該算作丟失。 如果是,則替換“if v(i) = ”。 帶有“如果丟失(v(i))”。

data want (drop=i);
  set have;
  array v(12) var1-var12;
  do i = 1 to 12;
    if v(i) = . then do;
      first_missing = min(first_missing,i);
      last_missing = max(last_missing,i);
    end;
  end;
run;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM