合并没有键变量的sas数据集

时间:2016-07-26 14:08:36

标签: merge sas

我试图在没有单个键变量的情况下合并两个数据集。两个数据集中的数据都是这样的:

study_id.....round....other variables different between the two sets
A000019....R012....etc  
A000019....R013  
A000047....R013  
A000047....R014  
A000047....R015  
A000267....R014  

这是我的代码......

DATA RAKAI.complete;
length study_id $ 8;
MERGE hivgps2 rccsdata;
BY study_id round;
RUN;

我尝试通过study_id和round进行合并,这是在数据集中共享的唯一两个变量。但它只是堆叠两个集合,创建正确数量的ID的两倍。 " study_id"的组合" round"提供唯一标识符,但没有一个变量。通过组合两个数据集共享的两个变量来编写新的唯一ID是否最有意义?

非常感谢

我意识到我可以在这里发布我打算处理潜在不需要空间的代码。

DATA hivgps2;
SET hivgps2;
study_id = compress(study_id);
round= compress(round);
RUN;

DATA rccsdata;
SET rccsdata;
study_id = compress(study_id);
round=compress(round);
RUN;

2 个答案:

答案 0 :(得分:3)

您的代码是通过多个变量合并的正确格式。包含两个数据集中的记录,因此如果没有任何一个键匹配,那么结果将与使用SET而不是MERGE的结果相同。

您确定两组数据之间是否有任何重叠?检查您的变量长度是否相同。如果它们是字符,那么请确保这些值在使用大写和小写字母时是一致的。确保值没有前导空格或其他非打印字符。另外,请确保您没有将格式附加到其中一个数据集,以便您看到的打印值不是数据中的实际值。

在清理数据步骤中,您应该强制变量的长度保持一致。此外,您可以压缩值不仅仅是空格。我想消除任何不正常的7位ASCII码。这将摆脱标签,不间断的空格,空值和其他奇怪的东西。在普通的7位ASCII中,可打印字符介于! (' 21&x; x或33十进制)和〜(' 7E' x或126十进制)。

data hivgps2_clean ;
  length study_id $10 round $5 ;
  set hivgps2;
  format study_id round ;
  study_id=upcase(compress(study_id,compress(study_id,collate(33,126))));
  round=upcase(compress(round,compress(study_id,collate(33,126))));
run;

proc sort; by study_id round; run;

data rccsdata_clean;
  length study_id $10 round $5 ;
  set rccsdata;
  format study_id round ;
  study_id=upcase(compress(study_id,compress(study_id,collate(33,126))));
  round=upcase(compress(round,compress(study_id,collate(33,126))));
run;

proc sort; by study_id round; run;

data want;
  merge hivgps2_clean(in=in1) rccsdata_clean(in=in2);
  by study_id round;
run;

答案 1 :(得分:0)

你可以试试,或者你可以使用proc sql join:

proc sql;
    create table rakai.complete as select
        a.*, b.*
        from hivgps2 as a
        full join rccsdata as b
        on a.study_id = b.study_id and a.round = b.round;
quit;