使用以下代码
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。如果我指定了整个字符串,则数据不会分组。有人也可以对此发表评论吗?
答案 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;
产生这个:
答案 1 :(得分:1)
修改您拥有的第一个DATA
步骤,以便将串联修复为8个字符的问题:
data mydata5;
length default numofkids $ 25;
input default $ numofkids $ count;
datalines;
现在,运行PROC SORT
,然后执行DATA
步骤来创建您的PROC FREQ
友好变量。您需要使用SAS的by
,last
和retain
语句来记住以前的行,以便汇总列以折叠它们。
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