SAS使用if条件对变量进行分组

时间:2014-05-13 00:21:58

标签: sas dataset transformation

使用以下代码

   data mydata5;
input default$ numofkids$ count;
datalines;
good nochildren 1500
good kids1to2   2200
good kids3plus  300
bad nochildren  500
bad kids1to2    300
bad kids3plus   200
;
run;

我创建了一个数据集

Obs default  numofkids count 
1   good      nochildr 1500 
2   good      kids1to2 2200 
3   good      kids3plu 300 
4   bad       nochildr 500 
5   bad       kids1to2 300 
6   bad       kids3plu 200 

我一直想要的是这样的事情

           nochildren   other
good             1500   2500
bad              500    500

我尝试了很多东西,但到目前为止还没有任何工作。我知道如果没有复杂的代码,有任何简单的方法。

我想运行一个datastep,我可以在其中设置mydata5并创建一个数据集,其格式就像我想要的那样,只需要最少的编码。

有人可以就此提供一些见解。

然后目的是运行proc freq以完成chisq测试。

我设法在代码方面取得了一些进展,但我的代码并没有像我想要的那样生成表格。但是,我能够做一个chisq测试无法解决

    data mydata6;
set mydata5;
if numofkids='nochildren' then Group=1;
else Group=2;
run;

proc freq data=mydata6;
weight count;
tables default*Group/chisq;
run;

data mydata61;
set mydata5;
if numofkids='kids3plu' then Group=1;
else Group=2;
run;

proc freq data=mydata61;
weight count;
tables default*Group/chisq;
run;

另外,我遇​​到的另一个问题是当我尝试对数据进行分组时,我必须指定numofkids=kids3plu而不是整个字符串kids3plus。如果我指定了整个字符串,则数据不会分组。有人也可以对此发表评论吗?

3 个答案:

答案 0 :(得分:2)

我会使用PROC SUMMARY / MEANS来完成总和,然后转置以创建您要查找的格式。

我正在创建新的数据集,以帮助您了解其工作原理。

data mydata5;
length default $4. numofkids $32.;
input default$ numofkids$ count;

datalines;
good nochildren 1500
good kids1to2   2200
good kids3plus  300
bad nochildren  500
bad kids1to2    300
bad kids3plus   200
;
run;

/*Populate a variable for "nochildren" and "other"*/
data mydata6;
set mydata5;
length kids $32.;
if numofkids = "nochildren"
    then kids=numofkids;
else
    kids = "other";
run;

proc sort data=mydata6;
by default kids;
run;

proc summary data=mydata6;
by default kids;
var count;
output out=mydata7 sum=;
run;

proc transpose data=mydata7 out=mydata8(drop=_name_);
by default;
id kids;
var count;
run;

产生这个: enter image description here

答案 1 :(得分:1)

修改您拥有的第一个DATA步骤,以便将串联修复为8个字符的问题:

data mydata5;
  length default numofkids $ 25;
  input default $ numofkids $ count;
  datalines;

现在,运行PROC SORT,然后执行DATA步骤来创建您的PROC FREQ友好变量。您需要使用SAS的bylastretain语句来记住以前的行,以便汇总列以折叠它们。

proc sort data=mydata5; by default; run;

data mydata6; set mydata5;
  by default;
  if numofkids="nochildren" then output;
  if numofkids="kids1to2" then hold1=count;
  if numofkids="kids3plus" then hold2=count;
  if last.default then do;
    numofkids="other";
    count=hold1+hold2;
    output;
  end;
  retain hold1 hold2;
run;

现在您可以运行PROC FREQ

答案 2 :(得分:0)

 data mydata5;
input default$ numofkids$ count;
datalines;
good nochildren 1500
good kids1to2   2200
good kids3plus  300
bad nochildren  500
bad kids1to2    300
bad kids3plus   200
;
run;

proc sort data=mydata5;
by default numofkids;
run; 

data edf;
set mydata5(rename=(count=noofchildren));
by default;
if first.default then count1=0;
if numofkids= 'nochildren' then output;
else count1+noofchildren;
other=count1;
if last.default then output;
keep default noofchildren other ;
run;


        Output will be like this:


                default   nochildren   other
                good           1500   2500
                bad            500    500