基本SAS认证,在if语句中包含input关键字

时间:2016-10-12 16:04:30

标签: sas

我对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内部发生的事情。

我认为只会阅读两个观察结果。

如何处理此文件的第一行。 当读取第一行时,不应该只读取年份的值。 在第二行中,数据读取年份和金额。 这很令人困惑。

让我知道我哪里出错了

2 个答案:

答案 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;