【问题标题】:merge columns in SASSAS中的合并列
【发布时间】:2017-07-10 02:34:24
【问题描述】:

我有两个来自不同来源但包含相似变量的数据集。一个类似的变量是数据集 A 中的“Procedure”和数据集 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。

谢谢!

【问题讨论】:

  • 你是如何“合并”文件的?您没有显示任何可用于匹配观察结果的 id 变量。
  • 您只是在寻找coalescec() 函数吗?

标签: r sas


【解决方案1】:

从您所在的位置只需使用数据步骤。以下应该可以解决问题:

data want;
drop procedure SurgicalProcedure;    
set have;
if procedure = . then char_procedure = put(SurgicalProcedure, 7.) ; 
else char_procedure = procedure;
run;

注意你的新变量是一个字符变量

【讨论】:

  • 这太棒了!太感谢了!你介意我再问几个问题吗?我目前的技能水平很难回答?
  • 我认为我的问题有点复杂。我以为我可以给你发消息,但似乎没有这个选项。我只是要单独发布我的问题。
【解决方案2】:

以下内容比较粗略,但可能满足您的需求。这是粗略的,因为它假设“手术”的价值总是你想要的。如果值不是您想要的值,则不会进行错误检查并且不会发出警告。

数据步骤“MergeAB”对数据集 A 和 B 执行“One-to-One”读取。然后它检查“procedure”变量。如果缺少该值,则将其替换为“surgical”变量的值。否则,保留“过程”变量的值。删除drop 语句,您将能够更清楚地看到MergeAB 数据步骤是如何运行的。也就是说,将行 data MergedAB (drop = procedure surgical); 替换为 data MergedAB;

这会重新创建您描述的数据。 input 语句中的 ampersand & 告诉 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 以避免隐式类型转换。

【讨论】:

    猜你喜欢
    • 2022-06-23
    • 2019-01-24
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多