Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sas 一个或多个数据步输出语句是如何工作的?它可以是隐式的吗?_Sas - Fatal编程技术网

Sas 一个或多个数据步输出语句是如何工作的?它可以是隐式的吗?

Sas 一个或多个数据步输出语句是如何工作的?它可以是隐式的吗?,sas,Sas,在SAS中运行数据步骤时,为什么output语句似乎“停止”set语句的迭代 我需要有条件地输出重复的观察结果。虽然我可以使用过多的输出语句,但我想知道SAS是否进行了正常的迭代,而输出只是创建了一个额外的观察 1 SAS中的run语句是否具有内置输出语句?sum语句具有内置retain的方式 2当我要求SAS输出某些观察结果时,特别是在set语句之后,会发生什么情况?它会设置所有的值直到出现条件,然后只保留我请求的值吗?或者它是否与其他语句(如point=语句)有某种相似之处 3是否有类似的输

在SAS中运行数据步骤时,为什么output语句似乎“停止”set语句的迭代

我需要有条件地输出重复的观察结果。虽然我可以使用过多的输出语句,但我想知道SAS是否进行了正常的迭代,而输出只是创建了一个额外的观察

1 SAS中的run语句是否具有内置输出语句?sum语句具有内置retain的方式

2当我要求SAS输出某些观察结果时,特别是在set语句之后,会发生什么情况?它会设置所有的值直到出现条件,然后只保留我请求的值吗?或者它是否与其他语句(如point=语句)有某种相似之处

3是否有类似的输出语句将继续设置前一数据步骤中的值,然后在请求时输出附加观察值

例如:

data test;
  do i = 1 to 100;
  output;
  end;
run;

data test2;
  set test;
  if _N_ in (4 8 11) then output;
run;

data test3;
  set test;
  if _N_ in (4 8 11) then output;
  output;
run;
data x;
 do row = 1 to 100;
  output;
  row_prev+1;
 end;
run;
测试有100个观察值,测试2有3个观察值,测试3有103个观察值。这使我认为,对于run语句或数据步骤本身,都有某种内置的output语句。

SAS中的output是一条显式指令,用于向输出数据集写入一行数据语句中命名的所有数据集,除非在output中指定一个数据集

run,除了结束该步骤意味着在完成该数据步骤之前不会处理run之后的任何语句(相当于c风格编程语言模块中的end})之外,基本上还包含一个隐式语句

除非您使用的是link或goto,否则return会告诉SAS返回到数据步循环的开头。此外,return包含一个隐式输出语句,该语句将行输出到data语句中命名的所有数据集,除非数据步骤代码中有一个output语句——在这种情况下,该语句不存在

是返回导致SAS在返回后实际停止处理,而不是输出。事实上,SAS很乐意在输出语句之后做一些事情;它们可能不会输出到任何地方。例如:

data test;
  do i = 1 to 100;
  output;
  end;
run;

data test2;
  set test;
  if _N_ in (4 8 11) then output;
run;

data test3;
  set test;
  if _N_ in (4 8 11) then output;
  output;
run;
data x;
 do row = 1 to 100;
  output;
  row_prev+1;
 end;
run;
执行该行的prev+1语句,即使它在output语句之后,也可以在下一行看到它的存在。在您的示例中,您告诉它只输出三行,但它仍然处理其他97行—它们没有输出任何内容。如果处理过程中发生了任何影响,它就会发生-事实上,_n_u的增加是其中的一种影响_n_u不是行号,而是数据步循环的迭代计数

您可能应该仔细阅读数据步骤本身。SAS文档包含了很多关于这方面的信息,或者你可以阅读类似的文章。这类事情在SGF论文中非常常见,部分原因是SAS认证要求对这一点有很好的理解。

SAS中的output是一个明确的指令,用于向输出数据集写入一行数据语句中命名的所有数据集,除非在输出中指定一个数据集

run,除了结束该步骤意味着在完成该数据步骤之前不会处理run之后的任何语句(相当于c风格编程语言模块中的end})之外,基本上还包含一个隐式语句

除非您使用的是link或goto,否则return会告诉SAS返回到数据步循环的开头。此外,return包含一个隐式输出语句,该语句将行输出到data语句中命名的所有数据集,除非数据步骤代码中有一个output语句——在这种情况下,该语句不存在

是返回导致SAS在返回后实际停止处理,而不是输出。事实上,SAS很乐意在输出语句之后做一些事情;它们可能不会输出到任何地方。例如:

data test;
  do i = 1 to 100;
  output;
  end;
run;

data test2;
  set test;
  if _N_ in (4 8 11) then output;
run;

data test3;
  set test;
  if _N_ in (4 8 11) then output;
  output;
run;
data x;
 do row = 1 to 100;
  output;
  row_prev+1;
 end;
run;
执行该行的prev+1语句,即使它在output语句之后,也可以在下一行看到它的存在。在您的示例中,您告诉它只输出三行,但它仍然处理其他97行—它们没有输出任何内容。如果处理过程中发生了任何影响,它就会发生-事实上,_n_u的增加是其中的一种影响_n_u不是行号,而是数据步循环的迭代计数


您可能应该仔细阅读数据步骤本身。SAS文档包含了很多关于这方面的信息,或者你可以阅读类似的文章。这类事情在SGF论文中非常常见,部分原因是SAS认证要求对这一点有相当好的理解。

了解一切的最佳方式是阅读PDV。以下是对您的问题的简短回答:

输出语句隐含在每个使用set、merge、update或nothing的SAS数据步骤的运行边界处

set语句获取当前行的内容,并将其读入PDV(如果只有一个set语句)

输出 语句只是将此时PDV的内容输出到输出数据集中

SAS仅在到达运行边界、delete语句、return语句或if WITHEN语句的条件失败时,才会转到由set语句定义的源数据集中的新行

点=强制SAS直接转到由变量定义的观察值;否则,它将依次读取每一行


了解一切的最好方法是阅读PDV。以下是对您的问题的简短回答:

输出语句隐含在每个使用set、merge、update或nothing的SAS数据步骤的运行边界处

set语句获取当前行的内容,并将其读入PDV(如果只有一个set语句)

output语句只是将此时PDV的内容输出到输出数据集中

SAS仅在到达运行边界、delete语句、return语句或if WITHEN语句的条件失败时,才会转到由set语句定义的源数据集中的新行

点=强制SAS直接转到由变量定义的观察值;否则,它将依次读取每一行


它在结尾是隐式的,除非在数据步骤中的一个或多个地方使用它


每次执行遇到输出语句或隐式语句(如果存在)时,它都会输出一个新行。

除非在该数据步骤的一个或多个位置使用它,否则它在末尾是隐式的

每次执行遇到输出语句,或者隐式语句(如果存在),它都会输出一个新行。

非常接近

1除非数据步骤包含显式输出语句,否则在数据步骤的末尾有一个隐含输出。这就是为什么你的第一步写了100条观察结果,而第二步只写了3条

2 OUTPUT语句告诉SAS将当前记录写入输出数据集

3在不使用输出语句的情况下,没有直接的方法来复制记录,但是对于一些类似的问题,可以在输入端而不是输出端造成复制

例如,如果你觉得你的班级没有足够的11岁孩子,你可以通过阅读两遍来复制所有11岁的孩子

data want;
  set sashelp.class 
      sashelp.class(where=(age=11))
  ;
  by name;
run;
你很接近

1除非数据步骤包含显式输出语句,否则在数据步骤的末尾有一个隐含输出。这就是为什么你的第一步写了100条观察结果,而第二步只写了3条

2 OUTPUT语句告诉SAS将当前记录写入输出数据集

3在不使用输出语句的情况下,没有直接的方法来复制记录,但是对于一些类似的问题,可以在输入端而不是输出端造成复制

例如,如果你觉得你的班级没有足够的11岁孩子,你可以通过阅读两遍来复制所有11岁的孩子

data want;
  set sashelp.class 
      sashelp.class(where=(age=11))
  ;
  by name;
run;

是的,任何没有显式输出语句的数据步骤都会在末尾得到隐式输出语句,这是理解数据步骤编程的基础。每当添加条件输出时,如在测试中,删除隐式输出,并且必须考虑是否需要将隐式输出返回。请参阅以了解更多信息。是的,理解数据步骤编程的基础是,任何没有显式输出语句的数据步骤都会在末尾得到隐式输出语句。每当添加条件输出时,如在测试中,删除隐式输出,并且必须考虑是否需要将隐式输出返回。更多信息,请参阅。我将改写第四点:SAS实际上只返回到数据步骤的顶部,而且返回也会导致这种情况。SAS在任何时候遇到set语句时都会转到源数据集中的新行,这可能会导致很多其他原因。我要改写第四点:它实际上是SAS只返回到数据步骤的顶部,而且return也会导致这种情况。SAS在任何时候遇到set语句时都会转到源数据集中的新行,除此之外,还有很多其他原因。