我的数据集现在有两个主要的变量 - Major和Major_Code。这些应该匹配1比1,但我需要修复一些错误,我发现的是14个Major_Code值,有两个不同的专业。这只是因为拼写或标点符号的变化,例如" ed。"和#34;教育"。他们应该在这里具有相同的价值,但不要。
所以我有一张7对的桌子。每对都有相同的Major_Code和不同的Major。如何为每个代码选择一个主要值?我唯一的想法是通过一个if-then声明,但这似乎非常低效。
我找到了像这样的加倍值:
proc freq data = majorslist; 表Major_Code / out = majorcodedups; 运行
proc print data = majorcodedups; 其中COUNT> 1; 运行
所以我可以很容易地找到这些观察结果,但不能提取某些值来覆盖另一个观察结果。我已经查看了数组,宏,sql和转置,但现在它已经超出了我的想法。
逻辑上它会像这样工作:
从obs i到n,在obs i找到变量x的值,在obs i找到变量y的值,转到obs(i + 1)并重复。
答案 0 :(得分:0)
假设您有一些规则来确定哪个MAJOR对于MAJOR_CODE是正确的,您应该这样做:
这假设majorslist
是每个主要/主要代码对的数据集,无论是否唯一 - 但每个主要/主要代码对只有一个。
proc sort data=majorslist;
by major_code major;
run;
data majorslist_unique;
set majorslist;
by major_code major;
if first.major_code and last.major_code then output;
else do;
*rule to determine whether to output it or not;
end;
run;
所以,你现在有了major_code / major关系。我们假设您选择了if first.major_code then output;
作为您的规则(即,使用按字母顺序排列的第一个主要值的major_code)。
现在,您需要将其应用于较大的数据集。有很多方法可以做到这一点 - 合并这个是一个,格式是另一个,对于初学者。格式的工作原理如下:
创建定义了FMTNAME, START, LABEL
的数据集。对于MAJOR_CODE
的每个值,构建一行,其中START
为MAJOR_CODE
,LABEL
为MAJOR
。我们还会添加一条额外的行,说明如何处理不匹配(如果你获得了major_code的新值)。
data for_fmt;
set majorslist_unique;
fmtname='MAJORF'; *add a $ if MAJOR_CODE is a character variable;
start=major_code;
label=major;
output;
if _n_=1 then do;
hlo='o';
call missing(start);
label='NONMATCHED';
output;
end;
keep fmtname start label hlo;
run;
proc format cntlin=for_fmt;
quit;
现在,您可以在MAJORF.
语句中使用格式$MAJORF.
(如果MAJOR_CODE是字符,则为PUT
)。
data my_bigdata2;
set my_bigdata;
major = put(major_code,MAJORF.);
run;