Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sas 按组折叠重复观测值时对换表_Sas_Transpose - Fatal编程技术网

Sas 按组折叠重复观测值时对换表

Sas 按组折叠重复观测值时对换表,sas,transpose,Sas,Transpose,我有一个带有诊断记录的数据集,患者可以有一个或多个记录,甚至是相同代码的记录。我无法使用group by变量“code”,因为它显示的错误与ID值code_v58在同一个by group中出现两次类似 data have; input id rand found code $; datalines; 1 101 1 001 2 102 1 v58 2 103 0

我有一个带有诊断记录的数据集,患者可以有一个或多个记录,甚至是相同代码的记录。我无法使用group by变量“code”,因为它显示的错误与ID值code_v58在同一个by group中出现两次类似

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 .
当我尝试使用let语句时

我得到的结果如下:

Obs id code_001 code_v58 code_003
1    1   1 . .
2    2   . 0 .
3    3   . 1 .
4    4   . . 1
5    5   . 0 .
我尝试并修改了PROC TRANSPOSE,在BY语句中使用ID和count

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,如果在任何记录中发现,则将代码更新为1吗?

在我看来,您需要这样的东西-首先预处理数据以获得要查找的值,然后在实际需要时进行转置。这个表格做了你想做的事情,取它的最大值,如果有,取1,如果只有0,取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;

  

在我看来,您需要这样的东西-首先预处理数据以获得所需的值,然后在实际需要时进行转置。这个表格做了你想做的事情,取它的最大值,如果有,取1,如果只有0,取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;

  
您可以转换组聚合视图

如果要替换缺少的值,请使用Proc STDIZE@Reeza进行后续操作。与0

您可以转换组聚合视图

如果要替换缺少的值,请使用Proc STDIZE@Reeza进行后续操作。与0


当您有副本时,您希望输出什么?正在删除正确答案,或者该列应该有2个,或者他们应该重复ie代码_v58_1代码_v58_2。如果您只想删除它们,请根据需要使用带有NODUPKEY的PROC SORT删除任何重复项。当您有重复的代码和不同的查找标志时,应选择哪个查找值0/1进行转置?第一个,最后一个,还是1个?@Reeza如果有重复的代码,我只需要保留该代码的存在,即,对于find=1only@Richard我只需要选择find=1。也就是说,每当患者有特定代码的病史时,我只需要获得一次诊断代码=1。所以first found=1就足够了。当您有重复项时,您希望输出什么?正在删除正确答案,或者该列应该有2个,或者他们应该重复ie代码_v58_1代码_v58_2。如果您只想删除它们,请根据需要使用带有NODUPKEY的PROC SORT删除任何重复项。当您有重复的代码和不同的查找标志时,应选择哪个查找值0/1进行转置?第一个,最后一个,还是1个?@Reeza如果有重复的代码,我只需要保留该代码的存在,即,对于find=1only@Richard我只需要选择find=1。也就是说,每当患者有特定代码的病史时,我只需要获得一次诊断代码=1。所以first found=1就足够了,我更喜欢这个答案。它运行得很快,因为我有超过80万张唱片。。。谢谢我更喜欢这个答案。它运行得很快,因为我有超过80万张唱片。。。谢谢这对我有用。但我有超过80万张唱片。所以它运行缓慢。非常感谢你的努力。我通过tablate proc学到了一些新东西……这对我很有用。但我有超过80万张唱片。所以它运行缓慢。非常感谢你的努力。我学到了一些新的使用表格程序。。。
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;
proc stdize data=want out=want missing=0 reponly;
var code_:;
run;