楼主: yellowriver
2509 6

[原创博文] 求助一段SAS编程(含数据,需要一点macro) [推广有奖]

  • 0关注
  • 4粉丝

VIP

博士生

38%

还不是VIP/贵宾

-

威望
0
论坛币
10028 个
通用积分
22.7632
学术水平
21 点
热心指数
26 点
信用等级
19 点
经验
3133 点
帖子
164
精华
0
在线时间
170 小时
注册时间
2007-11-4
最后登录
2019-5-18

50论坛币
小女初学SAS就遭遇research中实际数据,取个sample搬上来求教一下,别看下面文字很长,其实,对熟悉SAS的人来说应该真滴非常简单的。谢谢啦~

以下数据集含病人的家庭背景信息,血压,服药情况和是否是健康俱乐部会员等,变量有:id(20人), gender, birth_year,race, membership(健康俱乐部会员),bp(血压值), 部分病人有服药(没服药的就是缺失值)drug_date: 开始用药的时间; drug_type: IN/MET/TBE三种药

data trial1;
input id gender $ birth_year race $ member $ bp drug_date $ drug_type $;
cards;
1 M 1985 Asian Y 134 02/13/2006 IN
2 F 1984 White N 125 . .
3 F 1963 Black N 143 01/17/2005 MET
4 M 1972 White N 153 02/15/2006 TBE
5 F 1989 Asian Y 132 03/01/2007 IN
7 M 1978 Asian Y 135 . .
8 F 1958 White Y 142 . .
9 M 1968 Black Y 135 04/01/2007 MET
10 M 1978 White N 136 03/21/2005 IN
11 F 1989 Asian Y 138 02/21/2006 TBE
12 M 1986 Black N 143 . .
13 F 1987 Asian Y 132 . .
14 F 1976 White N 158 03/23/2007 IN
15 M 1969 Black N 145 04/26/2006 TBE
16 M 1980 Asian N 152 05/27/2006 MET
17 F 1985 Black Y 134 . .
18 M 1970 White Y 125 . .
19 F 1975 Asian N 135 02/21/2006 IN
20 M 1973 Black N 142 03/28/2006 MET
;
run;


1. 在input数据时如何把drug_date的length设为10?
2. 创建三个新变量年龄age(2011年减去birth_year),是否服药drug (如果原数据drug_date 或者 drug type 有一个 missing,则为N, 不缺失为Y), 服药的时长drug_time(现在日期减去drug_date开始服药的时间,但表示成“年”的形式,要不然数据值很大,缺失值的话为0年)

3. 现在我还有9个和以上数据集trial1一样的结构和变量名的数据集,trial2, trial3....trial 10, 和如何写一段sas macro, 来让以上的code自动地作用于其他9个数据集trial*
万分感谢!

最佳答案

baoaibaobao 查看完整内容

数据集中的drug_date $反正是需要修改,所以建议改为‘drug_date:mmddyy10.’ 然后用下面的代码...
关键词:Macro SAS编程 CRO acr Mac membership research 俱乐部 会员 健康

本帖被以下文库推荐

沙发
baoaibaobao 发表于 2011-1-27 17:20:16 |只看作者 |坛友微信交流群
数据集中的drug_date $反正是需要修改,所以建议改为‘drug_date:mmddyy10.’
然后用下面的代码...
  1. %macro trial(n);
  2. %do i=1 %to &n.;
  3.         data trial&i.;
  4.                 set trial&i.;
  5.                 format drug_Date mmddyy10.;
  6.                 age=2011-birth_year;
  7.                 if drug_type=' ' then drug='N';
  8.                         else drug='Y';
  9.                 drug_time=intck('year',drug_Date,today());
  10.                 if drug_time=. then drug_time=0;
  11.         run;
  12. %end;
  13. %mend;
  14. %trial(10);
复制代码

使用道具

藤椅
shijz03 发表于 2011-1-27 18:08:47 |只看作者 |坛友微信交流群
首先你读入的数据集需要把两个日期变量的长度定义为10 (length birth_date $10)不然只读8位。

下面的代码我偷懒写的,不太规范标准,算是抛砖引玉吧,你可以参考一下。

%macro extractdata(i);
data trial&i.case ;
set trial&i;
age=2011-birth_year;
if drug_type='' then drug='N';
else drug='Y';
M=substr(drug_Date,1,2);
D=substr(drug_date,4,2);
Y=substr(drug_date,7,4);
drug_time=today()-mdy(m,d,y);
drop m d y;
run;
%mend extractdata;
%macro redo();
%do i=1 %to 20;
%extractdata(&i)
%end;
%mend redo;
%redo()

使用道具

板凳
yellowriver 发表于 2011-1-27 18:37:41 |只看作者 |坛友微信交流群
麻烦求教一下,一开始数据集读入时如何确定一个日期变量长度为10?我加成这样,貌似不行,应该如何加?需要informat吗?
data trial1;
input id gender $ birth_year race $ member $ bp drug_date $10 drug_type $; (这样行不通)
shijz03 发表于 2011-1-27 18:08
首先你读入的数据集需要把两个日期变量的长度定义为10 (length birth_date $10)不然只读8位。

下面的代码我偷懒写的,不太规范标准,算是抛砖引玉吧,你可以参考一下。

%macro extractdata(i);
data trial&i.case ;
set trial&i;
age=2011-birth_year;
if drug_type='' then drug='N';
else drug='Y';
M=substr(drug_Date,1,2);
D=substr(drug_date,4,2);
Y=substr(drug_date,7,4);
drug_time=today()-mdy(m,d,y);
drop m d y;
run;
%mend extractdata;
%macro redo();
%do i=1 %to 20;
%extractdata(&i)
%end;
%mend redo;
%redo()

使用道具

报纸
456852 发表于 2011-1-27 19:24:37 |只看作者 |坛友微信交流群
data trial1;
infile datalines missover;
input id gender $ birth_year race $ member $ bp drug_date $10. drug_type $;
datalines;
1 M 1985 Asian Y 134 02/13/2006 IN
2 F 1984 White N 125
3 F 1963 Black N 143 01/17/2005 MET
4 M 1972 White N 153 02/15/2006 TBE
5 F 1989 Asian Y 132 03/01/2007 IN
7 M 1978 Asian Y 135
8 F 1958 White Y 142
9 M 1968 Black Y 135 04/01/2007 MET
10 M 1978 White N 136 03/21/2005 IN
11 F 1989 Asian Y 138 02/21/2006 TBE
12 M 1986 Black N 143
13 F 1987 Asian Y 132
14 F 1976 White N 158 03/23/2007 IN
15 M 1969 Black N 145 04/26/2006 TBE
16 M 1980 Asian N 152 05/27/2006 MET
17 F 1985 Black Y 134
18 M 1970 White Y 125
19 F 1975 Asian N 135 02/21/2006 IN
20 M 1973 Black N 142 03/28/2006 MET
;
run;

仅供参考

使用道具

地板
yellowriver 发表于 2011-1-27 22:14:16 |只看作者 |坛友微信交流群
baoaibaobao我知道你是个sas牛人,能不能赏脸光临一下我这个帖子,给我一点提示?多谢了!

http://www.pinggu.org/bbs/thread-1022002-1-1.html

2# baoaibaobao

使用道具

7
justins123 发表于 2011-1-30 07:00:55 |只看作者 |坛友微信交流群
我也是初学sas,我编写了一个程序,不用marco,用单独一列的数字把各文件区分开,统一处理后,再根据数字拆分为不同文件集,大家看下是不是可行啊

Data all;
array trail(*) trail1--trail10;
Do i=1 to 10;
set trail(i)(in=i);
end;
sortedby i;

data all;
age=2011-birth_year;
if drug_date='.' then missing_date='N';
else missing_date='Y';
if drug_type='' then missing_type='N';
else missing_type='Y';
if missing_date='Y' then drug_time=intck('year',drug_date,today());
else  drug_time=0;

data trial_(k);
set all;
do k=1 to 10;
if i=k then output trial(k);
end;
run;

使用道具

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

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

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

GMT+8, 2024-5-1 01:22