【问题标题】:SAS Change the first recordSAS 更改第一条记录
【发布时间】:2021-08-13 23:28:14
【问题描述】:

让我们想象一下下表...

obs State Imp i i2
1 me 100 100
2 me 90 100 100
3 me 80 100 100
4 me 70 100 100
5 me 1000 1000 100
6 me 900 1000 1000
7 me 800 1000 1000
8 me 0 1000 1000
9 me 2000 2000 1000
10 me 1900 2000 2000
11 gu 20 2000 2000
12 ca 40 2000 2000
13 ca 50 2000 2000
14 ca 30 2000 2000
15 ca 10 2000 2000

如您所见,“i2”列是滞后 (i)。我想做的是: 1.-列“i”随着它的进展找到最大值,所以我想重置该列 “i”每个第一个“状态”,以获得每个状态的最大值。 2.- 修改“i2”列,使其如下: “State”(obs 1-me、11-gu 和 12-ca)列“i”的每个第一个值都有值 “小鬼”列

obs State Imp i i2
1 me 100 100 100
2 me 90 100 100
3 me 80 100 100
4 me 70 100 100
5 me 1000 1000 100
6 me 900 1000 1000
7 me 800 1000 1000
8 me 0 1000 1000
9 me 2000 2000 1000
10 me 1900 2000 2000
11 gu 20 20 20
12 ca 40 40 40
13 ca 50 50 40
14 ca 30 50 50
15 ca 10 50 50

我试过这个代码,但它不起作用

data metodo;
set sa80;
    retain i;
    if first.state then i=max(imp);
    else i = max(imp,i);
    i2 = lag(i);
run;

data final;
set metodo;
    retain i2_aux;
    if first.state then i2_aux = total;
    else i2_aux = i2;
run;

希望你能帮忙,提前谢谢你

【问题讨论】:

  • 保留输入数据中已经存在的变量不会做任何事情。下次 SET 语句执行时,保留的值会被覆盖。

标签: sas reset


【解决方案1】:

主要是它不使用现有变量作为新的 RETAINed 变量,因为每次 SET 语句执行时,保留的值都会替换为从输入中读取的值。

如果数据按关键变量排序也有帮助,尽管您可以在 BY 语句中使用 NOTSORTED 关键字来处理分组但未排序的数据。

data have;
  input state $ imp ;
cards;
ca 40
ca 50
ca 30
ca 10
gu 20
me 100
me 90
me 80
me 70
me 1000
me 900
me 800
me 0
me 2000
me 1900
;

data want;
  set have ;
  by state notsorted;
  retain i;
  i=max(i,imp);
  if first.state then i=imp;
  i2=lag(i);
  if first.state then i2=imp;
run;

结果:

Obs    state     imp       i     i2

  1     ca        40      40      40
  2     ca        50      50      40
  3     ca        30      50      50
  4     ca        10      50      50
  5     gu        20      20      20
  6     me       100     100     100
  7     me        90     100     100
  8     me        80     100     100
  9     me        70     100     100
 10     me      1000    1000     100
 11     me       900    1000    1000
 12     me       800    1000    1000
 13     me         0    1000    1000
 14     me      2000    2000    1000
 15     me      1900    2000    2000

修复了重置 I 和 LAG(I) 调用的顺序。

【讨论】:

  • 非常感谢@Tom,你帮了我很多。我在运行程序时发现了一个新问题:因为我的数据是按状态排序的,所以“i2”的每一秒值都有最后一个状态的最后一个值“i”。为了纠正这种情况,我添加了一个 i3 = lag (i) 并从“i2”中获取状态的第一个值,其余的从“i3”中获取。再次感谢您=)
  • 使用两个 IF FIRST.STATE 语句,以便在调用 LAG() 之前将 I “固定”。有些人改用 IFN() 函数。它之所以有效,是因为 IFN() 每次都会执行所有输入,因此 LAG() 总是运行。 i=ifn(first.state,imp,max(imp,i));i2=ifn(first.state,imp,lag(i));
猜你喜欢
  • 2017-08-07
  • 1970-01-01
  • 1970-01-01
  • 2018-01-04
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
相关资源
最近更新 更多