SAS-替换连续的重复值

SAS-替换连续的重复值,sas,Sas,我是SAS的新手,搜索了此特定查询,但找不到解决此问题的内容。我想知道如何用另一个值替换连续值。如果我有一个包含以下行的变量: A B C D D D D D F R T 我想将连续重复的“D”替换为0(但保留第一个“D”),使其看起来像这样: A B C D 0 0 0 0 F R T 是否有SAS功能可以执行此操作?我需要某种循环吗 谢谢大家! 更新 下面我提供了一些伪代码和一个示例数据集 示例数据集: data a; input var1 $ var2 $ var3 $ var4 $

我是SAS的新手,搜索了此特定查询,但找不到解决此问题的内容。我想知道如何用另一个值替换连续值。如果我有一个包含以下行的变量:

A B C D D D D D F R T
我想将连续重复的“D”替换为0(但保留第一个“D”),使其看起来像这样:

A B C D 0 0 0 0 F R T
是否有SAS功能可以执行此操作?我需要某种循环吗

谢谢大家!

更新 下面我提供了一些伪代码和一个示例数据集

示例数据集:

data a;
input var1 $ var2 $ var3 $ var4 $ var5 $;
datalines;
a    d     d     d      c
c    d     c     d      b
a    d     a     a      d
;
run;
最终的数据集应如下所示,其中仅更改连续的“D”值(仅出现在第一行):

a    d     0     0      c
c    d     c     d      b
a    d     a     a      d
下面是一些我正在尝试使用的代码,但并没有让我走得很远

data b;
  set a;
  retain hold;
  array var(5) var1-var5;

  do i=1 to 5;
    do j=1 to 5;
      if i ne j and var(j)="d" and var(i)="d" then var(j)=0;

    end;
  end;
run;
它返回的是下表(与我想要的上表不同)。它不是仅用0替换“D”的连续值,而是替换“D”的任何重复值


我认为问题在于,我不确定如何确定是否仅存在连续副本,存储连续副本的索引范围,然后仅替换该特定范围内的值。在此方面的任何帮助都将不胜感激

我认为你的问题很好。这里有一种方法可以得到你想要的

data mydata;
score = "A";
output;
score = "B";
output;
score = "C";
output;
score = "D";
output;
score = "D";
output;
score = "D";
output;
score = "D";
output;
score = "F";
output;
score = "R";
output;
score = "T";
output;
run;

proc sort data=mydata;
by score;
run;

data newdata;
set mydata;
by score;

if first.score then output;
else do;
  score = 'O';
  output;
end;
run;

看起来是0而不是O。请记住,列是变量,行是观察值,因此如果需要0,可以用score='0'替换score='O',但不能使用score=0。编写的代码总是输出第一个实例,然后任何副本都会更改为O。如果您只想替换重复的D,则相应地修改If语句。希望有帮助。祝你学习SAS好运。我花了一段时间仍在学习

给你,你很接近。如果我的答案对你有用,请投票支持

data b;
 set a;
 drop j;

 array var(5) var1-var5;

 do j=5 to 2 by -1;
   if  (var(j)="d" and var(j-1)="d") then var(j)="0";
 end;

run;
以上假设双d必须出现在同一行上。如果要在第3行计算var5,在第4行计算var1,则需要使用retain语句和“hold”


当您提供样本数据时,请尝试思考问题并显示所有边缘条件。

有许多方法,这取决于您的数据结构,而您没有清楚地解释这些方法。是您的数据在一行中,还是这些观察值在一个变量中。此外,请根据SO规则发布您尝试过的任何内容。正如@Reeza所说,您的确切方法取决于数据的存储方式。然而,一个简单的算法是检查前面的值是否与当前值相同;如果是,则向前移动,直到找到一个新值,然后将该范围内的所有字符更改为0。为了便于将来参考,您可以在此处找到SAS函数和调用例程的完整列表:数据是多行和多列(因此上面显示的“a B C D D D D F R T”将是一列)。将有多个这样的列。数据没有按字母顺序排序,因为它不能(它对日期/时间敏感,所以顺序不能更改)。@ahjohnston25,因此如果我理解正确-您是说创建一个循环,以便为每一列(即每个变量)检查行,查看是否有重复的“D”,然后继续检查,直到出现新字符-当您点击一个新字符时,是否将除第一个“D”之外的所有先前的“D”替换为0?关于如何编写这样的循环有什么建议吗?我想我对循环有一个基本的了解,但不太明白如何测试一个范围,存储该范围,然后在该范围内更改值。如果原始顺序很重要怎么办?这个问题不清楚,也不符合发布您尝试过的内容的规则。好吧,提供的数据从一开始就进行了排序,但有一点很好。@DCR-我已经用一些代码更新了我的初始问题,我正在尝试使用这些代码。到目前为止取得了一些成功,但仍需继续努力。一定要去看看!谢谢你的帮助!啊哈!!!!倒退是关键。。。这确实简化了它。非常感谢。你能更详细地解释一下“保留等待”是怎么回事吗?我不确定我是否完全理解它,尽管我在看教程时留下了它。如果你对我的答案投了赞成票,我可能会想解释一下。我会尝试多次。当我这样做时,我收到了以下信息:“感谢您的反馈!一旦您赢得了总共15个声誉,您的投票将更改公开显示的帖子分数。”数据步骤sas逐行处理文件。当它转到下一行时,它不再具有上一行的内存,除非使用retain语句。令人困惑的是,如果在读取X的下一个值时,每行上都定义了一个变量X,那么它将用新值(而不是旧值)覆盖它所拥有的。但是,假设定义了X,而没有定义Y。在Y上做一个retain并设置Y=X。然后你将得到新的X值,在Y中你将得到以前的X值。当然,你必须弄清楚你想在第1行做什么(当n=1时)。
data b;
 set a;
 drop j;

 array var(5) var1-var5;

 do j=5 to 2 by -1;
   if  (var(j)="d" and var(j-1)="d") then var(j)="0";
 end;

run;