SAS中文论坛

标题: 多个变量里查找某个值出现的次数 [打印本页]

作者: lxh714    时间: 2014-4-14 20:56
标题: 多个变量里查找某个值出现的次数
A1 A2 A3 A4 A5
x   y   z    x   y
y   z    x   y   x
z   y   x   z     y
假设这样个数据集 统计出x、y、z分别出现的次数 怎么写应该
最后得到x=5 y=6 z=4 这样的结果


作者: AAA    时间: 2014-4-14 21:14
***CASE;
data a;
input (A1 A2 A3 A4 A5) ($);
cards;
x   y   z    x   y
y   z    x   y   x
z   y   x   z    y
;
run;

DATA A;
SET A END=T;
array a{*} a1-a5;
do i=1 to dim(A);
NX+COUNT(UPCASE(A(I)),'X');
NY+COUNT(UPCASE(A(I)),'Y');
NZ+COUNT(UPCASE(A(I)),'Z');
END;
IF T THEN PUT NX= NY= NZ=;
RUN;
作者: henryyhl    时间: 2014-4-14 21:20
本帖最后由 henryyhl 于 2014-4-14 21:35 编辑

一种比较笨的方法,抛砖引玉啊
data;
input A1 $ A2 $ A3 $ A4 $ A5 $;
retain         n_x        n_y        n_z        0;
n_x1=sum(A1="x",        A2="x",        A3="x",        A4="x",        A5="x");
n_y1=sum(A1="y",        A2="y",        A3="y",        A4="y",        A5="y");
n_z1=sum(A1="z",        A2="z",        A3="z",        A4="z",        A5="z");
n_x+n_x1;
n_y+n_y1;
n_z+n_z1;
drop n_x1 n_y1 N_z1;
cards;
x   y   z    x   y
y   z    x   y   x
z   y   x   z    y
;
run;

作者: shiyiming    时间: 2014-4-14 21:24
大家太给力了!
作者: hopewell    时间: 2014-4-15 09:34
  1. data raw;
  2.     input (A1 A2 A3 A4 A5) ($);
  3. datalines;
  4. x y z x y
  5. y z x y x
  6. z y x z y
  7. ;
  8. data _null_;
  9.     length var $8;
  10.     if _n_=1 then do;
  11.         declare hash h(hashexp:4,ordered:'y');
  12.         rc=h.definekey('var');
  13.         rc=h.definedata('var','count');
  14.         rc=h.definedone();
  15.         call missing(var,count);
  16.     end;
  17.     set raw end=last;
  18.     array a $ a1-a5;
  19.     do over a;
  20.         if h.find(key:a) then rc=h.add(key:a,data:a,data:1);
  21.         else do;
  22.             count+1; rc=h.replace();
  23.         end;
  24.     end;
  25.     if last then rc=h.output(dataset:'out');
  26. run;
复制代码

作者: mono    时间: 2014-4-15 14:05
本帖最后由 mono 于 2014-4-15 14:07 编辑

试试这个。

data a;
input (A1 A2 A3 A4 A5) ($);
cards;
x   y   z    x   y
y   z    x   y   x
z   y   x   z    y
;
run;
proc iml;
   use a;
  read all ;
b = A1|| A2|| A3||A4||A5;
k = loc( b='x' );
l=loc(b='y');
m=loc(b='z');
x = ncol(k);
y = ncol(l);
z = ncol(m);
print x y z;

作者: lxh714    时间: 2014-4-15 21:59
mono 发表于 2014-4-15 14:05
试试这个。

data a;

这个proc步没见过诶。。长见识了
作者: lxh714    时间: 2014-4-15 22:00
谢谢大家哈 万分感激 问题解决啦
作者: webgu    时间: 2014-4-16 08:56
呵呵,一天没来,居然这么热闹啊
作者: slash    时间: 2014-4-16 14:51
AAA 发表于 2014-4-14 21:14
***CASE;
data a;
input (A1 A2 A3 A4 A5) ($);

数组是简单快捷的方法。
作者: slash    时间: 2014-4-16 14:53
henryyhl 发表于 2014-4-14 21:20
一种比较笨的方法,抛砖引玉啊
data;
input A1 $ A2 $ A3 $ A4 $ A5 $;

此种方法也是一种好方法。
作者: slash    时间: 2014-4-16 14:54
hopewell 发表于 2014-4-15 09:34

用hash对象的都是高手!仔细一看,原来是hopewell,膜拜!
作者: soporaeternus    时间: 2014-4-18 10:22
hopewell 发表于 2014-4-15 09:34

这是最好的办法,要是有600个水平,其他办法......
作者: 愤怒的老鸟    时间: 2014-4-18 17:20
给力啊 hopewell 好方法




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2