SAS 对变量进行组内编号、循环编号、递增编号和有限重复循环编号

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SAS 对变量进行组内编号、循环编号、递增编号和有限重复循环编号相关的知识,希望对你有一定的参考价值。

(第一列为原始数值,第二列为原始分组。第三至第六列为已完成的分组编号)
1 a 1 1 1 1
5 a 2 2 1 1
0 a 3 3 1 2
7 a 4 1 2 2
1 a 5 2 2 1
5 a 6 3 2 1
6 b 1 1 3 2
8 b 2 2 3 2
4 b 3 3 3 1

参考技术A 不了解分组规则。你可以把第三至第六每列的编号规则说清楚。追问

第三列:按第二列分组编号
第四列:123 123 123 循环
第五列:递增啊 可以根据数据不同来定个数 11 22 33。。。或者像例子里面那样
第六列:有限重复编号
SAS 对变量进行组内编号、循环编号、递增编号和有限重复循环编

交织 SAS 数据集(按常见患者编号)

【中文标题】交织 SAS 数据集(按常见患者编号)【英文标题】:Interleaving SAS Data Sets (by common patient number) 【发布时间】:2016-06-14 02:39:20 【问题描述】:

我需要交错到 SAS 数据集,但前提是它们都存在患者 ID。在合并语句中,我会使用“in”和“if”,但是,我需要堆叠数据。数据在变量方面是等价的。

有什么想法吗?

【问题讨论】:

不会因为这个技巧而进行内部连接(在 ID 上)吗? 如果 obs 是 FIRST.ID 和 IN 数据集 2,那么数据集 1 中没有 obs。 【参考方案1】:

这有点麻烦,但如果数据集相同,那么您可以尝试以下方法。假设您在变量 ID 上进行匹配。

proc sql;
select t1.*
from
  TABLE_A t1
where ID in (select ID from TABLE_B)
union all
select t2.*
from
  TABLE_B t2  
where ID in (select ID from TABLE_A)
;quit;

【讨论】:

谢谢。但是,它并没有真正起作用,可能是因为我的 SQL 技能。 TABLE_A 是数据吗? t1.* 是 ??也许我应该提到每个患者 ID 有多个观察结果。 如果您可以举一个小例子说明您现有的输入和输出,那么也许有人可以提出更好的答案:)【参考方案2】:

如果您在任一数据集上恰好有一行,则在数据步骤中很容易做到这一点。

data have_1;
  do id = 1 to 20 by 2;
    output;
  end;
run;

data have_2;
  do id = 1 to 20 by 3;
    output;
  end;
run;

data want;
  set have_1 have_2;
  by id;
  if not (first.id and last.id);
run;

基本上,如果它不是该 ID 的第一行或不是最后一行,则仅输出一行 - 如果它在两个数据集中都为真,则为真。如果每个 ID 在任一数据集中都有多行,则此方法不起作用。

【讨论】:

【参考方案3】:

如果您在一个或两个数据集中的每个 ID 都有重复项,那么您还有很多其他解决方案。这是与您的 MERGE 想法最相似的一个。

在 Double DoW 循环中,您循环遍历数据集两次,一次检查您的条件,然后一次实际输出。这使您可以查看每个 ID 的所有行,查看您的条件是否有效,然后再次查看所有行以针对该条件采取行动。

data have_1;
  do id = 1 to 20 by 2;
    output;
    output;
  end;
run;

data have_2;
  do id = 1 to 20 by 3;
    output;
    output;
  end;
run;



data want;
  _a=0;  *initialize temporary variables;
  _b=0;  *they will be cleared once for each ID;
  do _n_ = 1 by 1 until (last.id);
    set have_1(in=a) have_2(in=b);
    by id;
    if a then _a=1;  *save that value temporarily;
    if b then _b=1;  *again temporary;
  end;
  do _n_ = 1 by 1 until (last.id);
    set have_1 have_2;
    by id;
    if _a and _b then output;  *only output the rows that have both _a and _b;
  end;
run;

【讨论】:

以上是关于SAS 对变量进行组内编号、循环编号、递增编号和有限重复循环编号的主要内容,如果未能解决你的问题,请参考以下文章

子表多个数据取回其一

SAS中字符数据的编号范围列表

Oracle分析函数之排序 row_number() & rank()

组内的条件行编号

Mysql - 如何按用户对行进行编号? [复制]

当子窗口具有递增值时如何增加父组编号?