l**********s 发帖数: 255 | 1 data one;
input id x y;
datalines;
1 1 0
2 0 1
3 1 1
4 0 0
5 1 0
;
以上是我的数据(data one),我想建一个新的数据如下(data two),第一列是data one
里的变量名(x,y),第二列是"1"出现的次数,第三列是"1"出现的次数和总数(5)的比例
. 该怎么算呢?多谢多谢。
data two------
x 3 60%
Y 2 40% |
l**********s 发帖数: 255 | 2 声明一点,以上不是题目,是老板给的活,鼓励俺自学+问人。 |
l***a 发帖数: 12410 | 3 proc tabulate data=one missing out=one_xy;
class x y;
table 'x', x*(n pctn);
table 'y', y*(n pctn);
run;
work out x and y separately and union one_x and one_y
one
【在 l**********s 的大作中提到】 : data one; : input id x y; : datalines; : 1 1 0 : 2 0 1 : 3 1 1 : 4 0 0 : 5 1 0 : ; : 以上是我的数据(data one),我想建一个新的数据如下(data two),第一列是data one
|
l**********s 发帖数: 255 | 4 另外如果数据(DATA ONE)稍改动下,x有MISSING DATA,算比例的时候不想把MISSING
DATA算在内, 也就是说总数是5-1=4,又该怎么办呢?
data one;
input id x y;
datalines;
1 1 0
2 0 1
3 1 1
4 0 0
5 . 0
; |
l**********s 发帖数: 255 | 5 THANKS!!!!!!!!!!!!!!!!
【在 l***a 的大作中提到】 : proc tabulate data=one missing out=one_xy; : class x y; : table 'x', x*(n pctn); : table 'y', y*(n pctn); : run; : work out x and y separately and union one_x and one_y : : one
|
o****o 发帖数: 8077 | 6 PROC FREQ
************************************;
proc freq data=one noprint;
table x/out=_xxxx(where=(x=1));
table y/out=_yyyy(where=(y=1));
run;
data _zzzz;
length var $ 1;
set _xxxx(in=_1 drop=x)
_yyyy(in=_2 drop=y);
if _1 then var='x';
else var='y';
run;
【在 l**********s 的大作中提到】 : 另外如果数据(DATA ONE)稍改动下,x有MISSING DATA,算比例的时候不想把MISSING : DATA算在内, 也就是说总数是5-1=4,又该怎么办呢? : data one; : input id x y; : datalines; : 1 1 0 : 2 0 1 : 3 1 1 : 4 0 0 : 5 . 0
|
l***a 发帖数: 12410 | 7 then ignore the "missing" option
【在 l**********s 的大作中提到】 : 另外如果数据(DATA ONE)稍改动下,x有MISSING DATA,算比例的时候不想把MISSING : DATA算在内, 也就是说总数是5-1=4,又该怎么办呢? : data one; : input id x y; : datalines; : 1 1 0 : 2 0 1 : 3 1 1 : 4 0 0 : 5 . 0
|
l**********s 发帖数: 255 | 8 I tried, but did not work.
【在 l***a 的大作中提到】 : then ignore the "missing" option
|
l**********s 发帖数: 255 | 9 Thanks!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
【在 o****o 的大作中提到】 : PROC FREQ : ************************************; : proc freq data=one noprint; : table x/out=_xxxx(where=(x=1)); : table y/out=_yyyy(where=(y=1)); : run; : data _zzzz; : length var $ 1; : set _xxxx(in=_1 drop=x) : _yyyy(in=_2 drop=y);
|
l**********s 发帖数: 255 | 10 非常感谢楼上的牛人们,俺想了一上午的东东,牛人们一会就解决了!! |
|
|
l**********s 发帖数: 255 | 11 再问下哈,谁知道spss里用哪个命令做呢?老板不用sas,每次都要把数据转成sas。俺
急需成为sas+spss双语人才。 |
s*******2 发帖数: 791 | |
l**********s 发帖数: 255 | 13 data one;
input id x y Z A B C;
datalines;
1 1 0 1 1 1 1
2 0 1 1 1 1 1
3 1 1 1 1 1 1
4 0 0 1 1 1 1
5 1 0 0 0 0 0
;
再问下,其实我的真实数据里类似X,Y的数据有100多个,该怎么加上MACRO用呢?MACRO
是我攻克了好几次都失败的地方,试验了半天总出错。
我把DATA ONE又改动了一下,多了几个变量Z, A ,B,C。牛人们能否再教导下,加上
MACRO,怎么把变量 X,Y, Z, A,B,C一下子算出来呢? |
l***a 发帖数: 12410 | 14 combine the use array and macro
MACRO
【在 l**********s 的大作中提到】 : data one; : input id x y Z A B C; : datalines; : 1 1 0 1 1 1 1 : 2 0 1 1 1 1 1 : 3 1 1 1 1 1 1 : 4 0 0 1 1 1 1 : 5 1 0 0 0 0 0 : ; : 再问下,其实我的真实数据里类似X,Y的数据有100多个,该怎么加上MACRO用呢?MACRO
|
o****o 发帖数: 8077 | 15 data one;
input id x y Z A B C;
datalines;
1 1 0 1 1 1 1
2 0 1 1 1 1 1
3 1 1 1 1 1 1
4 0 0 1 1 1 1
5 1 0 0 0 0 0
;
run;
proc contents data=one out=onevars(keep=name varnum where=(upcase(name)^='
ID')) noprint; run;
data _null_;
set onevars end=eof;
if _n_=1 then call execute('proc freq data=one noprint;');
call execute('table '||name||' /out'||compress('=_'||name)||'(where=('|
|name||'=1));');
if eof then call execute ('run;');
run;
options source ;
data _null_;
c
【在 l**********s 的大作中提到】 : data one; : input id x y Z A B C; : datalines; : 1 1 0 1 1 1 1 : 2 0 1 1 1 1 1 : 3 1 1 1 1 1 1 : 4 0 0 1 1 1 1 : 5 1 0 0 0 0 0 : ; : 再问下,其实我的真实数据里类似X,Y的数据有100多个,该怎么加上MACRO用呢?MACRO
|
l***a 发帖数: 12410 | 16 another one
proc contents data=one out=one_var (keep=name varnum where=(name~='id')) nop
rint;
run;
proc sort data=one_var;
by varnum;
run;
data _null_;
set one_var end=last;
length allvar $100.;
format allvar $100.;
retain allvar;
if _n_=1 then allvar='';
count+1;
call symput(compress('var'||count),compress(name));
allvar=compbl(allvar||name||' ');
if last then do;
call symput('allvar',compbl(allvar));
call symput ('var_ct',count);
end;
run;
%put &var_ct &var1 &var2 &var
【在 o****o 的大作中提到】 : data one; : input id x y Z A B C; : datalines; : 1 1 0 1 1 1 1 : 2 0 1 1 1 1 1 : 3 1 1 1 1 1 1 : 4 0 0 1 1 1 1 : 5 1 0 0 0 0 0 : ; : run;
|
o****o 发帖数: 8077 | 17 you may want to avoid those loopy macros in practice;
*********************;
proc sql noprint;
select cat('table ', compress(name),' /out=', compress('_'||name), '(
where=(',compress(name),'=1));')
into :tablestmt separated by ' '
from onevars
;
select (compress('_'||name)||'(in=_'||name||'drop='||name||')')
into :setstmt separated by ' '
from onevars
;
select ('if '||compress('_'||name)||'=1 then varname='||compress('"'||
name||'"')||'
【在 l***a 的大作中提到】 : another one : proc contents data=one out=one_var (keep=name varnum where=(name~='id')) nop : rint; : run; : proc sort data=one_var; : by varnum; : run; : data _null_; : set one_var end=last; : length allvar $100.;
|
k*****u 发帖数: 1688 | |
l***a 发帖数: 12410 | 19 //adm
guess I can see your sas coding style. will try later
【在 o****o 的大作中提到】 : you may want to avoid those loopy macros in practice; : *********************; : proc sql noprint; : select cat('table ', compress(name),' /out=', compress('_'||name), '( : where=(',compress(name),'=1));') : into :tablestmt separated by ' ' : from onevars : ; : select (compress('_'||name)||'(in=_'||name||'drop='||name||')') : into :setstmt separated by ' '
|
l**********s 发帖数: 255 | 20 真心感谢各位牛人的指导!!困扰了几天的问题解决了,今天晚上俺可以早点睡觉了,
哈哈。 |
l**********s 发帖数: 255 | 21 接下来感叹,啥时候俺也能牛几把呢?决定把看了一半的SAS书再借回来看看。 |