在SAS中将站点名称和编号顺序分配给patid

在SAS中将站点名称和编号顺序分配给patid,sas,Sas,我有一个包含许多站点的数据集(如下面的摘录),其中最后有XXX的3个参与者是额外的虚拟参与者。我想要的是修改这些XXX patid,使其符合我在下面的“想要”数据集中的格式,而不是将XXX放在末尾,同时保持组分配不改变数据集 data have; input site $ patid $ group $; datalines; ABC ABCPROT01001 A ABC ABCPROT01002 B ABC ABCPROT01003 A ABC ABCPROT01005 A ABC ABC

我有一个包含许多站点的数据集(如下面的摘录),其中最后有XXX的3个参与者是额外的虚拟参与者。我想要的是修改这些XXX patid,使其符合我在下面的“想要”数据集中的格式,而不是将XXX放在末尾,同时保持组分配不改变数据集

data have;
 input site $ patid $ group $;
 datalines;
ABC ABCPROT01001 A
ABC ABCPROT01002 B
ABC ABCPROT01003 A
ABC ABCPROT01005 A
ABC ABCPROT01006 A
ABC ABCPROT01XXX B
ABC ABCPROT01XXX A
ABC ABCPROT01XXX B
CDF CDFPROT01004 A
CDF CDFPROT01005 A
CDF CDFPROT01006 A
CDF CDFPROT01007 B
CDF CDFPROT01008 A
CDF CDFPROT01009 B
CDF CDFPROT01010 A
CDF CDFPROT01012 A
CDF CDFPROT01013 B
CDF CDFPROT01XXX B
CDF CDFPROT01XXX B
CDF CDFPROT01XXX A
AMD AMDPROT01001 A
AMD AMDPROT01002 B
AMD AMDPROT01003 A
AMD AMDPROT01XXX B
AMD AMDPROT01XXX A
AMD AMDPROT01XXX A
;
run;


data want;
input site $ patid $ group $;
datalines;
ABC ABCPROT01001 A
ABC ABCPROT01002 B
ABC ABCPROT01003 A
ABC ABCPROT01005 A
ABC ABCPROT01006 A
ABC ABCPROT01007 B
ABC ABCPROT01008 A
ABC ABCPROT01009 B
CDF CDFPROT01004 A
CDF CDFPROT01005 A
CDF CDFPROT01006 A
CDF CDFPROT01007 B
CDF CDFPROT01008 A
CDF CDFPROT01009 B
CDF CDFPROT01010 A
CDF CDFPROT01012 A
CDF CDFPROT01013 B
CDF CDFPROT01014 B
CDF CDFPROT01015 B
CDF CDFPROT01016 A
AMD AMDPROT01001 A
AMD AMDPROT01002 B
AMD AMDPROT01003 A
AMD AMDPROT01004 B
AMD AMDPROT01005 A
AMD AMDPROT01006 A
;
run;

我假设三个额外的OB不在have数据集中

试试这个

data have;
 input site $ patid $12.;
 datalines;
ABC ABCPROT01001
ABC ABCPROT01002
ABC ABCPROT01003
ABC ABCPROT01005
ABC ABCPROT01006
CDF CDFPROT01004
CDF CDFPROT01005
CDF CDFPROT01006
CDF CDFPROT01007
CDF CDFPROT01008
CDF CDFPROT01009
CDF CDFPROT01010
CDF CDFPROT01012
CDF CDFPROT01013
AMD AMDPROT01001
AMD AMDPROT01002
AMD AMDPROT01003
;

data want;
   do _N_ = 1 by 1 until (last.site);
      set have;
      by site notsorted;
      l = input(substr(patid, length(patid) - 2), 3.);
      output;
   end;
   do l = l + 1 to l + 3;
      substr(patid, 10, 3) = put(l, z3.);
      output;
   end;
run;

我假设三个额外的OB不在have数据集中

试试这个

data have;
 input site $ patid $12.;
 datalines;
ABC ABCPROT01001
ABC ABCPROT01002
ABC ABCPROT01003
ABC ABCPROT01005
ABC ABCPROT01006
CDF CDFPROT01004
CDF CDFPROT01005
CDF CDFPROT01006
CDF CDFPROT01007
CDF CDFPROT01008
CDF CDFPROT01009
CDF CDFPROT01010
CDF CDFPROT01012
CDF CDFPROT01013
AMD AMDPROT01001
AMD AMDPROT01002
AMD AMDPROT01003
;

data want;
   do _N_ = 1 by 1 until (last.site);
      set have;
      by site notsorted;
      l = input(substr(patid, length(patid) - 2), 3.);
      output;
   end;
   do l = l + 1 to l + 3;
      substr(patid, 10, 3) = put(l, z3.);
      output;
   end;
run;

这个答案解决了两个问题:

  • 您的XXX观察结果已在数据中
  • 它只处理XXX个观察值的组
  • 代码:


    这个答案解决了两个问题:

  • 您的XXX观察结果已在数据中
  • 它只处理XXX个观察值的组
  • 代码:


    嗨,德雷库特!XXX的额外观测值在我的have数据集中,这让我大吃一惊。因此,我想将其从AMDPROT01xx更改为AMDPROT01004等,同时保持其他一些列的内容不变。基本上,所发生的事情是,我有一个在这些地点随机分配的现有参与者的列表(分配给a组或B组),但我想说明每个地点额外的3个虚拟参与者(那些有XXX的)因为我想将它们与原始参与者分开随机分组。所以现在我需要弄清楚如何将XXX改为每个站点上最后一个现有参与者之后的序列中的下一个数字。例如,如果最后一个现有参与者是AMDPROT01003,我想将所有3个AMDPROT01xx更改为AMDPROT01004、AMDPROT01005、AMDPROT01006,但我想保留表示随机分配的组列(我编辑了初始数据集)Hi draycut!XXX的额外观测值在我的have数据集中,这让我大吃一惊。因此,我想将其从AMDPROT01xx更改为AMDPROT01004等,同时保持其他一些列的内容不变。基本上,所发生的事情是,我有一个在这些地点随机分配的现有参与者的列表(分配给a组或B组),但我想说明每个地点额外的3个虚拟参与者(那些有XXX的)因为我想将它们与原始参与者分开随机分组。所以现在我需要弄清楚如何将XXX改为每个站点上最后一个现有参与者之后的序列中的下一个数字。例如,如果最后一个现有参与者是AMDPROT01003,我想将所有3个AMDPROT01x更改为AMDPROT01004、AMDPROT01005、AMDPROT01006,但我想保留表示随机分配的组列(我编辑了我的初始数据集),因此您想用不同的3位字符串替换XXX。使用什么数字重要吗?是否应从上一个值开始?它们是否应该以
    900
    开头?因此您希望用不同的3位字符串替换XXX。使用什么数字重要吗?是否应从上一个值开始?他们应该从
    900
    开始吗?非常感谢你,draycut!这完全符合我的需要。非常感谢你,德雷库特!这完全符合我的需要。