我对Base SAS考试有疑问。 这个问题出现在其中一个练习测试中。
该问题询问将从以下数据输入多少记录
A 1995 100
B 1997 200
C 1996 200
D 1994 200
E 1997 200
F 1992 200
问题中的代码如下所示
data one;
infile rawdata;
input @3 year 4.;
if year = 1997 then input @8 amount 3.;
run;
正确答案是4条记录。但我不明白这是如何运作的。 有人可以帮我详细解释PDV内部发生的事情。
我认为只会阅读两个观察结果。
如何处理此文件的第一行。 当读取第一行时,不应该只读取年份的值。 在第二行中,数据读取年份和金额。 这很令人困惑。
让我知道我哪里出错了
答案 0 :(得分:2)
这是一个棘手的问题。那是因为代码描述的行为可能是错误的。 (这就是他们正在测试你看到的东西 - 如果你能发现错误,基本上。)
该代码中没有任何内容告诉SAS不输出一行,无论是否存在特定值。 EAMEID | EAMDATE | EAMATTNSTATUS|
------ | --------| -------------|
161 |20/7/2016| 6 |
161 |20/7/2016| 7 |
位中没有if year=1997
,因此输出的每一行都包括其他行。
然而,第一个output
没有input
告诉它保持行指针!这意味着,它不会输入与该@
条记录相关联的amount
,而是会实际输入 next year
字段。
所以你将拥有以下几行:
amount
我建议使用数据步调试器调试代码,以便更清楚地看到。
这是一个基于PUT的调试,可以帮助您更好地看待它:
A 1995
B 1997 200 <- but the 200 from C!
D 1994
E 1997 200 <- but the 200 from F!
之后记录内容:
data one;
infile datalines;
input @3 year 4.;
infile_var = _INFILE_;
put "After first readin" +1 year= +1 "_INFILE_=" infile_var;
if year = 1997 then input @8 amount 3.;
infile_var = _INFILE_;
put "After IF statement" +1 year = +1 "_INFILE_=" infile_var /;
datalines;
A 1995 100
B 1997 200
C 1996 200
D 1994 200
E 1997 200
F 1992 200
;;;;
run;
答案 1 :(得分:1)
为了说明Joe对来自以下行的amount
输入值的观点,请尝试运行以下内容:
data one;
input @3 year 4.;
if year = 1997 then input @8 amount 3.;
cards;
A 1995 100
B 1997 200
C 1996 300
D 1994 200
E 1997 200
F 1992 300
;
run;