【问题标题】:SAS grouping variables using if conditionSAS使用if条件对变量进行分组
【发布时间】:2014-06-30 12:29:20
【问题描述】:

使用以下代码

   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

我已经尝试了很多东西,但到目前为止没有任何效果。我知道有任何简单的方法,而无需进入复杂的代码。

我想运行一个数据步骤,我可以在其中设置 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。如果我指定了整个字符串,则数据没有分组。请问有人能评论一下吗?

【问题讨论】:

    标签: sas dataset transformation


    【解决方案1】:

    我会使用 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;
    

    产生这个:

    【讨论】:

      【解决方案2】:

      修改您的第一个DATA步骤如下,以修复连接为8个字符的问题:

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

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

      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

      【讨论】:

      • 谢谢 Gary- 但是,我想创建我创建的第一个数据集并使用它创建新数据集,该数据集将以首选格式显示我想要的输出。
      【解决方案3】:
       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
      

      【讨论】:

      • 请更好地解释您的解决方案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      • 2016-05-25
      • 1970-01-01
      相关资源
      最近更新 更多