我有两个来自不同来源的数据集,但包含类似的变量。一个这样的类似变量是来自数据集A的“过程”和来自数据集B的“SurgicalProcedure”。
我已经将这两个数据集合并为一个我们称之为数据集C的巨型数据集。
有时这两个变量中的观察结果是匹配的,有时它们是不同的,有时观察在一个观察中缺失但在另一个中存在。
我想要做的是合并两个变量,以便“过程”覆盖“SurgicalProcedure”中的任何内容,但如果“过程”缺少观察并且“SurgicalProcedure”具有该观察结果,那么“SurgicalProcedure”观察保留在最后合并的列中。
示例:
Procedure SurgicalProcedure
1 total mastectomy
2 segmental mastectomy
. MRM
5 Seg. Mast with IOLM
7 .
10 total mast. w/ IOLM, SLNB
. Seg. Mast with IOLM, SLNB
3 OLM, SLNB
期望的结果:
Procedure
1
2
MRM
5
7
10
Seg. mast. w/ IOLM, SLNB
3
有人可以帮我解决SAS中的问题吗?如果不是SAS,那么R是可以的,甚至是Excel,但更喜欢SAS。
谢谢!
答案 0 :(得分:0)
以下内容相当粗糙,但可能符合您的需求。它是粗糙的,它假设“外科手术”的价值总是你想要的。如果值不是您想要的值,则没有错误检查并且没有警告。
数据步骤“MergeAB”执行数据集A和B的“One-to-One”读取。然后检查“过程”变量。如果缺少该值,则将其替换为“手术”变量的值。否则,保留“procedure”变量的值。删除drop
语句,您将能够更清楚地了解MergeAB
数据步骤的运作方式。也就是说,只用data MergedAB (drop = procedure surgical);
替换行data MergedAB;
。
这会重新创建您描述的数据。 &
语句中的ampersand input
告诉SAS读取空格。
/*Create dataset A*/
data A;
length procedure $ 100;
input procedure;
datalines;
1
2
.
5
7
10
.
3
;
run;
/*Create data set B*/
data B;
length surgical $ 100;
input surgical &;
datalines;
total mastectomy
segmental mastectomy
MRM
Seg. Mast with IOLM
.
total mast. w/ IOLM, SLNB
Seg. Mast with IOLM, SLNB
OLM, SLNB
;
run;
此步骤实际执行合并:
/*Merge A and B*/
data MergedAB (drop = procedure surgical);
set A;
set B;
if missing(procedure) then merged = surgical;
else merged = procedure;
run;
我应该注意,我假设您的数据属于字符类型。但是,看起来“过程”列可能是数字数据。如果是这种情况,您可能需要使用PUT
statement到convert the numeric to character来避免隐式类型转换。
答案 1 :(得分:0)
您只需使用数据步骤即可。以下应该可以解决问题:
data want;
drop procedure SurgicalProcedure;
set have;
if procedure = . then char_procedure = put(SurgicalProcedure, 7.) ;
else char_procedure = procedure;
run;
请注意,您的新变量是字符变量