【问题标题】:Transposing table while collapsing duplicate observations per BY group在折叠每个 BY 组的重复观察时转置表
【发布时间】:2020-12-18 16:31:58
【问题描述】:

我有一个包含诊断记录的数据集,即使对于相同的代码,患者也可以有一个或多个记录。我无法使用按变量“代码”分组,因为它显示的错误类似于 ID 值“code_v58”在同一个 BY 组中出现两次。

data have;
    input id rand found  code $;
    datalines;            
    1   101      1      001
    2   102      1      v58
    2   103      0      v58  /* second diagnosis record for patient 2 */
    3   104      1      v58
    4   105      1      003
    4   106      1      003  /* second diagnosis record for patient 4 */
    5   107      0      v58
    ;

Desired output:
Obs id code_001 code_v58 code_003
1    1   1 . .
2    2   . 1 . /* second diagnosis code's {v58} status for patient 2 is 1, so it has to be taken*/
3    3   . 1 .
4    4   . . 1
5    5   . 0 .

当我尝试使用像 [this] 这样的 let 语句时,

proc transpose data=temp out=want(drop=_name_) prefix=code_ let;
  by id;
  id code;   * column name becomes <prefix><code>;
  var found;
run;

我得到如下输出:

Obs id code_001 code_v58 code_003
1    1   1 . .
2    2   . 0 .
3    3   . 1 .
4    4   . . 1
5    5   . 0 .

我尝试了this 并修改了 PROC TRANSPOSE 以在 BY 语句中使用 ID 和计数

proc transpose data=temp out=want(drop=_name_) prefix=code_;
      by id count;
      id code;   * column name becomes <prefix><code>;
      var found;
    run;

得到如下输出:

   Obs id count code_001 code_v58 code_003
    1   1  1     1 . .
    2   2  1     . 1 .
    3   2  2     . 0 .
    4   3  1     . 1 .
    5   4  1     . . 1
    6   4  2     . . 1
    7   5  1     . 0 .

如果在任何记录中找到重复的患者 ID,我可以知道如何删除重复的患者 ID 并将代码更新为 1 吗?

【问题讨论】:

  • 当你有重复时你想要什么输出?正在删除正确答案,或者该列应该有 2 还是应该重复(即 code_v58_1 code_v58_2)。如果您只想删除它们,请使用 PROC SORT 和 NODUPKEY 根据需要删除任何重复项。
  • 当您有重复的代码和不同的发现标志时,应该选择哪个发现值 (0/1) 进行转置?第一个,最后一个,还是第一个?
  • @Reeza 如果存在重复项,我只需要保留该代码的存在,即仅用于 found=1
  • @Richard 我只需要选择 found=1。也就是说,只要患者有该特定代码的历史,我只需要获得一次诊断代码 =1。所以先找到=1就够了。

标签: sas transpose


【解决方案1】:

你可以transpose一个群聚合view。

proc sql; 
  create view have_v as
  select id, code, max(found) as found
  from have
  group by id, code
  order by id, code
;

proc transpose data=have_v out=want prefix=code_;
  by id;
  id code;
  var found;
run;

如果您想用 0 替换缺失值 (.),请跟进 Proc STDIZE(感谢 @Reeza)

proc stdize data=want out=want missing=0 reponly;
var code_:;
run;

【讨论】:

  • 我更喜欢这个答案。它运行得很快,因为我有超过 80 万条记录...谢谢..!!
【解决方案2】:

在我看来,您想要这样的东西 - 首先预处理数据以获得您想要的 FOUND 值,然后转置(如果您确实需要)。 TABULATE 执行您想要为 FOUND 执行的操作(取其最大值,如果存在则为 1,如果仅存在 0,则为 0,否则为缺失),然后以与之前相同的方式进行转置。

proc tabulate data=have out=tab;
class id code;
var found;    
tables id,code*found*max;
run;

proc transpose data=tab out=want prefix=code_;
  by id;
  id code;
  var found_max;
run;

  

【讨论】:

  • 这对我有用。但我有超过 80 万条记录。所以它运行缓慢。非常感谢您的努力。我使用制表过程学到了一些新东西...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2021-11-11
相关资源
最近更新 更多