2016-12-20 122 views
0

假設我有10個變量,全部使用相同的前綴(它們以com開頭)。假設變量是二元的,並且有一些缺失的數據,我想將所有缺少的數據設置爲0.我想爲每個原始變量生成一個新變量,以便原始數據是完整。sas:一次重新編碼一堆變量

我該如何去重新編碼所有這些變量?有沒有一種簡單的方法可以在SAS中運行循環?如果這是Python或R,我可以編寫一個循環來使用grep或類似的東西來完成。

編輯:這是我想要做的。我想使用一個無索引數組與com變量創建它們的副本,稱爲new_com(每個變量的前綴爲new)。然後我只想重新編碼,我知道我可以使用ifthen聲明。第一部分,關於克隆變量,是我卡住的地方。

+0

您可以使用if語句定義每個新變量,例如,如果com1 = = 。那麼com1_nm = 0; else com1_nm = com1; 或者這將是非常重複的,你可以使用do循環和數組來節省你寫出這麼多的代碼。 http://support.sas.com/resources/papers/proceedings10/158-2010.pdf –

+0

謝謝,這很有幫助,但有兩個問題:我需要使用前綴重命名變量, d而不必在數組中單獨列出每一個,而是使用一些通配符。任何有關如何做到這一點的見解? – vashts85

回答

1

以下事件進行編輯,你不知道你有多少個變量有,但知道你想要的前綴:

data test; 
    input coma comet compton communism come comb community comerade complete comma; 
    datalines; 
    1 1 1 0 0 . 0 0 1 . 
    ; 
run; 

%let prefix=com; 

/* output the list of variables and only keep those with prefix */ 
proc contents data = test noprint out=names(keep=name varnum); run; 

proc sort data = names; 
    by varnum; 
run; 

/* create your new variable with a "new_" prefix */ 
data names1; set names; 
    if index(name,"&prefix."); 
    new_name = "new_"||strip(name); 
run; 

/* put lists into macro variables */ 
proc sql noprint; 
    select name 
    into: old_vars separated by " " 
    from names1; 

    select new_name 
    into: new_vars separated by " " 
    from names1; 

    select count(*) 
    into: nobs 
    from names1; 
quit; 

%put &old_vars.; 
%put &new_vars.; 
%put &nobs.; 

/* use array and macro variables to manipulate data */ 
data test1; set test; 
    array old(&nobs.) &old_vars.; 
    array new(&nobs.) &new_vars.; 
     do i=1 to &nobs.; 
      if old(i) = . then new(i) = 0; 
       else new(i) = old(i); 
     end; 
    drop i; 
run; 
+0

如果我不這樣做?有沒有辦法告訴SAS找到'old'的長度? – vashts85

+0

我編輯了上面的代碼來反映這一點。所有你需要知道的是你的前綴,你應該設置。 – Foxer

1

假設你已經SAS/STAT的許可,這是使用PROC STDIZE最簡單的實現:

data have; 
    array com[10]; 
    call streaminit(7); 
    do _j = 1 to 10; 
    do _i = 1 to 10; 
     if rand('Uniform') < 0.2 the com[_i]=.; 
     else com[_i]=1; 
    end; 
    output; 
    end; 
run; 

proc stdize data=have out=have_zero missing=0 reponly sprefix=new_ oprefix=old_; 
    var com:; 
run; 

reponly說不做任何標準化(僅歸咎於缺少零),sprefixoprefix指定哪些前綴規範化和原始變量用。

+1

如果您希望原始變量保留其名稱,則不使用前綴選項使用OPREFIX。 –

+0

編輯:嗯,它沒有工作_first_時間我做到了,但現在它確實... – Joe