合并SAS中的列

时间:2017-02-20 17:31:35

标签: r sas

我有两个来自不同来源的数据集,但包含类似的变量。一个这样的类似变量是来自数据集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。

谢谢!

2 个答案:

答案 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 statementconvert 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;

请注意,您的新变量是字符变量