我正在做一个家庭作业问题,关于使用数组和循环来创建一个新的变量来识别何时获得最大血铅值的日期,但被卡住了。对于上下文,以下是家庭作业问题:
1990年,波士顿进行了一项关于儿童血铅水平的研究。研究中25名儿童的以下变量以列表格式在文件lead_sum2018.txt中的每个受试者的多行中输入:
第1行ID号(数字,值1-25)出生日期(mmddyy8格式)血样日期1(数字,初始可能范围:-9至31)血样月份1(数字,初始可能范围:-9至12)
第2行ID号(数字,值1-25)血液样本日期2(数字,初始可能范围:-9至31)血液样本月份2(数字,初始可能范围:-9至12)
第3行ID号(数字,值1-25)血液样本日期3(数字,初始可能范围:-9至31)血液样本月份3(数字,初始可能范围:-9至12)
第4行ID号(数字,值1-25)血铅水平样本1(数字,可能范围: 0.01 - 20.00)血铅水平样本2(数字,可能范围: 0.01 - 20.00)血铅水平样本3(数字,可能范围: 0.01 - 20.00)性别(字符,‘M’或‘F’)
所有的血液样本都是在1990年抽取的。然而,在数据录入期间,血液样本的顺序被打乱,使得数据文件中的第一个血液样本(血液样本1)可能不对应于在对象上采集的第一个血液样本,它可以是第一个、第二个或第三个。此外,一些抽血的月份、日期和天数没有写在表格上。在数据输入时,丢失的月份和丢失的日期值分别编码为-9。
该项目的调查团队对缺失值做出了以下决定。任何缺少的天数应设置为等于15,任何缺少的月份应设置为等于6。对此数据集进行的任何分析都需要遵循这些决定。请确保按照每个问题的指示实施SAS语法。例如,如果项目规定必须使用SAS数组和循环,请使用这些数组和循环。
以下是HW引用的数据(它是列表格式,包含在一个名为lead_sum2018.txt的单独文件中):
1 04/30/78 6 10
1 -9 7
1 14 1
1 1.62 1.35 1.47 F
2 05/19/79 27 11
2 20 -9
2 5 6
2 1.71 1.31 1.76 F
3 01/03/80 11 7
3 6 6
3 27 2
3 3.24 3.4 3.83 M
4 08/01/80 5 12
4 28 -9
4 3 4
4 3.1 3.69 3.27 M
5 12/26/80 21 5
5 3 7
5 -9 12
5 4.35 4.79 5.14 M
6 06/20/81 7 10
6 11 3
6 22 1
6 1.24 1.16 0.71 F
7 06/22/81 19 6
7 3 12
7 29 8
7 3.1 3.21 3.58 F
8 05/24/82 26 7
8 31 1
8 9 10
8 2.99 2.37 2.4 M
9 10/11/82 2 7
9 25 5
9 28 3
9 2.4 1.96 2.71 F
10 . 10 8
10 30 12
10 28 2
10 2.72 2.87 1.97 F
11 11/16/83 19 4
11 15 11
11 7 -9
11 4.8 4.5 4.96 M
12 03/02/84 17 6
12 11 2
12 17 11
12 2.38 2.6 2.88 F
13 04/19/84 2 12
13 -9 6
13 1 7
13 1.99 1.20 1.21 M
14 02/07/85 4 5
14 17 5
14 21 11
14 1.61 1.93 2.32 F
15 07/06/85 5 2
15 16 1
15 14 6
15 3.93 4 4.08 M
16 09/10/85 12 10
16 11 -9
16 23 6
16 3.29 2.88 2.97 M
17 11/05/85 12 7
17 18 1
17 11 11
17 1.31 0.98 1.04 F
18 12/07/85 16 2
18 18 4
18 -9 6
18 2.56 2.78 2.88 M
19 03/02/86 19 4
19 11 3
19 19 2
19 0.79 0.68 0.72 M
20 08/19/86 21 5
20 15 12
20 -9 4
20 0.66 1.15 1.42 F
21 02/22/87 16 12
21 17 9
21 13 4
21 2.92 3.27 3.23 M
22 10/11/87 7 6
22 1 12
22 -9 3
22 1.43 1.42 1.78 F
23 05/12/88 12 2
23 21 4
23 17 12
23 0.55 0.89 1.38 M
24 08/07/88 17 6
24 27 11
24 6 2
24 0.31 0.42 0.15 F
25 01/12/89 4 7
25 15 -9
25 23 1
25 1.69 1.58 1.53 MA)输入数据,在数据步骤中:
1)确保出生日期变量记录为SAS日期;
2)使用SAS数组和循环为三个血样中的每一个创建SAS日期变量,并根据调查人员的决定处理丢失的数据。提示:使用单个数组and循环分别重新编码日和月的缺失值,并使用数组/ do循环创建SAS日期变量;
3)使用SAS函数为每个孩子创建最高值(即最大值)的变量;
4)使用SAS数组和循环来识别获得该最大值的日期,并为最大血铅值的日期创建一个新变量;
5)确定获得最大血铅值的儿童的年龄(四舍五入到小数点后两位);
6)根据儿童在获得最大铅值的年份(称为“agecat”)的年龄创建一个新的变量,该变量分为三个级别:对于4岁以下的儿童,agecat应等于1;对于至少4岁但不到8岁的儿童,agecat应等于2;对于至少8岁的儿童,agecat应为3。
7)打印出出生日期、最大血铅水平的日期、最大血铅水平的血样年龄、年龄、性别和最大血铅水平的变量(仅打印这些要求的变量)。应将所有日期的格式设置为使用mmddyy10。对输出进行格式化。
我在响应时使用的代码是:
libname HW3 'C:\Users\johns\Desktop\SAS';
filename HW3new 'C:\Users\johns\Desktop\SAS\lead_sum2018.txt';
data one;
infile HW3new;
informat dob mmddyy8.;
input #1 id dob dbs1 mbs1
#2 dbs2 mbs2
#3 dbs3 mbs3
#4 bls1 bls2 bls3 sex;
array dbs{3} dbs1 dbs2 dbs3;
array mbs{3} mbs1 mbs2 mbs3;
do i=1 to 3;
if dbs{i}=-9 then dbs{i}=15;
end;
do i=4 to 6;
if mbs{i}=-9 then mbs{i}=6;
end;
array date{3} mdy1 mdy2 mdy3;
do i=1 to 3;
date{i}=mdy(mbs{i}, dbs{i}, 1990);
end;
maxbls=max(of bls1-bls3);
array bls{3} bls1 bls2 bls3;
array maxdte{3} maxdte1 maxdte2 maxdte3;
do i=1 to i=3;
if bls{i}=maxbls then maxdte=i;
end;
agemax=maxdte-dob;
ageest=round(agemax/365.25,2);
if agemax=. then agecat=.;
else if agemax < 4 then agecat=1;
else if 4 <= agemax < 8 then agecat=2;
else if agemax ge 8 then agecat=3;
run; 我收到了这个错误:
22 maxbls=max(of bls1-bls3);
23 array bls{3} bls1 bls2 bls3;
24 array maxdte{3} maxdte1 maxdte2 maxdte3;
25 do i=1 to i=3;
26 if bls{i}=maxbls then maxdte=i;
ERROR: Illegal reference to the array maxdte.
27 end;有没有人对这个问题有什么建议?我做错什么了?我是否应该为采集最大血铅样本值的日期创建一个额外的数组?谢谢!
**我被困在A部分的#4,但我为了上下文而包含了其他部分。谢谢!**编辑:我包含了必须读取到SAS中的数据以及它所来自的文件的文件名
发布于 2018-06-03 18:55:36
仅仅查看错误之前的代码,您就会遇到下面这一行的问题:
26 if bls{i}=maxbls then maxdte=i;因为您试图为数组maxdte赋值,所以会出现错误。不能像那样为数组赋值(除非您使用的是已弃用的do over语法...)取而代之的是,选择数组中的一个元素,并将值分配给该元素。例如,你可以这样做:
26 if bls{i}=maxbls then maxdte{1}=i;或者,您可以使用包含相关数组索引的变量,而不是文字1。
发布于 2018-06-03 20:54:43
您没有正确处理第2-4行中的ID字段
input #1 id dob dbs1 mbs1
#2 dbs2 mbs2
#3 dbs3 mbs3
#4 bls1 bls2 bls3 sex; 例如,您需要跳过第2-3行上的字段1,或者将ids读取到数组中,也许是为了检查它们是否都相同。
input #1 id dob dbs1 mbs1
#2 id2 dbs2 mbs2
#3 id3 dbs3 mbs3
#4 id4 bls1 bls2 bls3 sex; 这个示例展示了如何检查是否有4行代码具有相同的ID,如果确实如此,则读取其余变量或执行LOSTCARD。ID 3有一条缺失的记录;
353 data ex;
354 infile cards n=4 stopover;
355 input #1 id #2 id2 #3 id3 #4 id4 @;
356 if id eq id2 eq id3 eq id4
357 then input #1 id dob:mmddyy. dbs1 mbs1
358 #2 id2 dbs2 mbs2
359 #3 id3 dbs3 mbs3
360 #4 id4 bls1 bls2 bls3 sex :$1.;
361 else lostcard;
362 format dob mmddyy.;
363 cards;
NOTE: LOST CARD.
RULE: ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0
372 3 01/03/80 11 7
373 3 27 2
374 3 3.24 3.4 3.83 M
375 4 08/01/80 5 12
NOTE: LOST CARD.
376 4 28 -9
NOTE: LOST CARD.
377 4 3 4
NOTE: The data set WORK.EX has 3 observations and 15 variables.
data ex;
infile cards n=4 stopover;
input #1 id #2 id2 #3 id3 #4 id4 @;
if id eq id2 eq id3 eq id4
then input #1 id dob:mmddyy. dbs1 mbs1
#2 id2 dbs2 mbs2
#3 id3 dbs3 mbs3
#4 id4 bls1 bls2 bls3 sex :$1.;
else lostcard;
format dob mmddyy.;
cards;
1 04/30/78 6 10
1 -9 7
1 14 1
1 1.62 1.35 1.47 F
2 05/19/79 27 11
2 20 -9
2 5 6
2 1.71 1.31 1.76 F
3 01/03/80 11 7
3 27 2
3 3.24 3.4 3.83 M
4 08/01/80 5 12
4 28 -9
4 3 4
4 3.1 3.69 3.27 M
;;;;
run;
proc print;
run;https://stackoverflow.com/questions/50662742
复制相似问题