2016-07-26 111 views
0

我正在尝试合并两个没有单个密钥变量的数据集。数据看起来像这样的两组数据:合并没有密钥变量的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合并和圆形这是跨共享的只有两个变量数据集。但它只是叠加两组创建两倍的正确数量的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; 

回答

3

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

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

在清理数据步骤中,您应该强制变量的长度保持一致。你也可以从值中压缩更多的空间。我喜欢消除任何不是正常的7位ASCII码的东西。这将摆脱制表符,不间断空格,空值和其他奇怪的事情。在正常的7位ASCII中,可打印字符介于两者之间! ('21'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; 
+0

通过数据看,应该有几乎完全重叠。我没有格式,数值看起来是一样的,我有这个代码在那里试图处理潜在的空间,抱歉格式混乱,我想这将是。 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; – jkh107

+0

甜蜜的耶稣汤姆它工作!我需要研究清洁代码,所以下次我可以做,非常感谢 – jkh107

0

你可以试试,或者你可以只使用一个进程SQL连接:

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; 
+0

我可能会应用是错误的,但是当我在代码插槽它仍然给我一个未结合的一套82206条意见(每套包含41103)。我正在拍摄一组完全合并的41103 obs。我读错了吗? – jkh107

+0

如果您有'study_id'和'round'变量来标识两个数据集中的观察值,则应该相应地加入它们。你可以发布数据集的样本吗? – superfluous

+0

当然,但我不知道如何以正确的方式做到这一点。我的第一个问题和所有 – jkh107