Sas 按组折叠重复观测值时对换表
我有一个带有诊断记录的数据集,患者可以有一个或多个记录,甚至是相同代码的记录。我无法使用group by变量“code”,因为它显示的错误与ID值code_v58在同一个by group中出现两次类似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
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;