楼主: cinaiyimu
7867 11

[问答] 求助SAS查找字符的函数 [推广有奖]

  • 4关注
  • 0粉丝

硕士生

25%

还不是VIP/贵宾

-

威望
0
论坛币
881 个
通用积分
29.0613
学术水平
0 点
热心指数
2 点
信用等级
0 点
经验
1430 点
帖子
69
精华
0
在线时间
183 小时
注册时间
2016-6-8
最后登录
2023-5-23

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
有下列数据,逗号分隔的是每一项目的编号,出现编号则表示该项目阳性,没有出现某编号则表示该项目为阴性。想要知道各项目阴性阳性各有多少例。
IDvar

2

57,2,7,9,16,35

1


3

17

4

5

5

21,55

6

9,39,58,60


原来想用index函数,将该变量拆成60个二分类变量(共有60个项目),程序是 if index(var,"2")>0 then v2=1;else v2=0;
然而由于12,22,52,都含有2,该结果就不对了。想出的笨办法是手动在EXCEL把编号1-9的项目命名为A-I的字母,然后再用index函数。然而数据有点多,有没有用SAS解决的简单办法?谢谢,拜托各位大神了!!




二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Index EXCEL 二分类变量 分类变量 exce SAS函数 index scan substr

已有 1 人评分热心指数 收起 理由
eijuhz + 2 精彩帖子

总评分: 热心指数 + 2   查看全部评分

沙发
zkfu41 发表于 2018-5-9 07:48:55 |只看作者 |坛友微信交流群
如果数据量不大,可以用excel直接做。先存成文本文件,然后用excel读入,读入时选择用“,”作为分隔符,就可以把这个变量拆分。

使用道具

try SCAN

使用道具

板凳
cinaiyimu 发表于 2018-5-9 10:29:12 |只看作者 |坛友微信交流群
翻了SAS官方关于functions 的书,找到了一个适合我这个问题的函数 indexw. 该函数的官方介绍:Function: INDEXW
Purpose: To search a string for a word, defined as a group of letters separated on both ends by a word boundary (a space, the beginning of a string, end of the string). Note that punctuation is not considered a word boundary.
本问题,用EXCEL的替换功能将逗号替换为空格,再用indexw 即成功搞定
代码:
  1. data new;
  2. input ID $3. var $40.;
  3. datalines;
  4. 2        57 2 7 9 16 35
  5. 1       
  6. 3        17
  7. 4        5
  8. 5        21 55
  9. 6        9 39 58 60
  10. ;

  11. data new2;
  12.   set new;
  13.   if indexw(var,"5")>0 then v5=1;
  14.   if indexw(var,"6")>0 then v6=1;
  15.   if indexw(var,"9")>0 then v9=1;
  16.   if indexw(var,"16")>0 then v16=1;
  17. run;
复制代码
结果: TIM截图20180509102137.png

使用道具

报纸
cinaiyimu 发表于 2018-5-9 10:31:09 |只看作者 |坛友微信交流群
zkfu41 发表于 2018-5-9 07:48
如果数据量不大,可以用excel直接做。先存成文本文件,然后用excel读入,读入时选择用“,”作为分隔符,就 ...
变量拆分后依旧需要方法整合同一编码的项目,比较麻烦。我已解决,谢谢回答!

使用道具

地板
cinaiyimu 发表于 2018-5-9 10:31:35 |只看作者 |坛友微信交流群
孤单的我们 发表于 2018-5-9 09:14
try SCAN
谢谢回复,但scan不适用于现在的情况

使用道具

7
cinaiyimu 发表于 2018-5-9 10:42:09 |只看作者 |坛友微信交流群
由于60个项目太多,每个都用if then 太麻烦。请教大佬们,有没有do loop 或宏程序的方法简化编码?

使用道具

8
流水不朽 发表于 2018-5-9 15:57:51 |只看作者 |坛友微信交流群
1、先把ID 和项目编号单独 罗列出来  
data   tmp;
    set dt1;
format new_var $10.;
  n=countw(var,',');   
  do i=1 to n;
      new_var=scan(var,i);
      output;
end;
2、需要问清楚其他问题,再进行下一步
ID值,与 var 值是什么关系,你需要的业务判断是怎样的?
run;

使用道具

9
cinaiyimu 发表于 2018-5-9 17:39:54 |只看作者 |坛友微信交流群
流水不朽 发表于 2018-5-9 15:57
1、先把ID 和项目编号单独 罗列出来  
data   tmp;
    set dt1;
根据您的方法我做出的结果是这样的:
TIM截图20180509173040.png
似乎用scan找出的是var 各有几个项目,最后一个项目是什么。不太符合我的目的。我想知道的是var中各个项目分别出现了多少次。比如一些问卷的多选题数据,想知道选A的有多少人,B的多少人,后续可能要分组,分别对两组是否选A进行卡方检验,看有无显著差异。

同样感谢~

使用道具

10
流水不朽 发表于 2018-5-9 17:49:23 |只看作者 |坛友微信交流群
其实代码产生的结果是这样子,注意两个红框。

只是我不知道你最终想要怎样的结果表格,
你举个例子,我就能帮你弄出同样的表格

无标题.png (31.24 KB)

无标题.png

无标题.png (31.24 KB)

无标题.png

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-23 22:01