Sas 如何";在所有响应值中加上最小正值的一半;取日志前

Sas 如何";在所有响应值中加上最小正值的一半;取日志前,sas,transformation,Sas,Transformation,我的一些响应变量的值为零。我想找出正的最小值是什么,除以2,在取log之前,把这个值加到所有的原始值上。请帮我做这个。这是我当前的代码,但似乎不正确 data dat; set dat; lvar = log(var + (min(var) / 2)); run; 下面是一些示例数据 data dat; cards; a var 1 0 2 5 3 6 4 7 5 10 6 2 7 0 8 4 9 0 ; 感谢您在数据步骤中提出的任何建议,您可以通过双道循环来实现这一点。不依赖隐式数

我的一些响应变量的值为零。我想找出正的最小值是什么,除以2,在取log之前,把这个值加到所有的原始值上。请帮我做这个。这是我当前的代码,但似乎不正确

data dat; set dat;
    lvar = log(var + (min(var) / 2));
run;
下面是一些示例数据

data dat;
cards;
a var
1 0
2 5
3 6
4 7
5 10
6 2
7 0
8 4
9 0
;

感谢您在数据步骤中提出的任何建议,您可以通过双道循环来实现这一点。不依赖隐式数据步循环,而是显式循环。在一个数据步骤中,您读取一次数据以找到最小值,然后再次读取数据以计算lvar和输出记录

比如:

data want;

  *loop through all records, to find the minimum;
  do until(eof);
    set dat end=eof;

    if var ne 0 then minvar=min(var,minvar);
  end;
  eof=0; *reset eof flag;


  *loop through the records again, computing lvar;
  *and outputting each record;
  do until(eof);
    set dat end=eof;
    lvar=log(var+minvar);
    put (_all_)(=);
    output;
  end;
run;

在一个数据步骤中,您可以使用双道循环来实现这一点。不依赖隐式数据步循环,而是显式循环。在一个数据步骤中,您读取一次数据以找到最小值,然后再次读取数据以计算lvar和输出记录

比如:

data want;

  *loop through all records, to find the minimum;
  do until(eof);
    set dat end=eof;

    if var ne 0 then minvar=min(var,minvar);
  end;
  eof=0; *reset eof flag;


  *loop through the records again, computing lvar;
  *and outputting each record;
  do until(eof);
    set dat end=eof;
    lvar=log(var+minvar);
    put (_all_)(=);
    output;
  end;
run;

您可以使用SQL而不是数据步骤吗?代码将在SQL中工作,但不是数据步骤,因为MIN函数在两者之间的操作不同。您现在使用它的方式是它在PROC SQL中的工作方式。您可以使用SQL而不是数据步骤吗?代码将在SQL中工作,但不是数据步骤,因为MIN函数在两者之间的操作不同。您现在使用它的方式是它在procsql中的工作方式。