SAS使用一次观察中的值来覆盖不同的观察值

时间:2014-03-25 17:26:06

标签: arrays select sas overwrite

我的数据集现在有两个主要的变量 - 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)并重复。

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的每个值,构建一行,其中STARTMAJOR_CODELABELMAJOR。我们还会添加一条额外的行,说明如何处理不匹配(如果你获得了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;