【问题标题】:SAS use value from one observation to overwrite different oneSAS 使用来自一个观察值的值来覆盖不同的观察值
【发布时间】:2014-05-03 17:37:24
【问题描述】:

我现在有一个包含两个主要变量的数据集 - Major 和 Major_Code。这些应该匹配 1 到 1,但是我需要修复一些错误,我发现对于 14 个 Major_Code 值,有两个不同的 Majors。这只是由于拼写或标点符号的变化,例如“ed”。和“教育”。它们在这里应该具有相同的值,但没有。

所以我有一张有 7 对的桌子。每对具有相同的 Major_Code 和不同的 Major。如何为每个代码选择一个主要值?我唯一的想法是通过 if-then 语句,但这似乎非常低效。

我发现双倍的值是这样的:

proc freq data=majorslist; 表 Major_Code/out=majorcodedups; 运行;

proc 打印数据=majorcodedups; 其中计数 > 1; 运行;

所以我可以很容易地找到这些观察结果,但无法提取某些值来覆盖另一个观察结果。我已经研究过数组、宏、sql 和转置,但现在这一切都让我有点想不通。

从逻辑上讲,它会这样工作:

从 obs i 到 n,在 obs i 处找到变量 x 的值,在 obs i 处将值输出到变量 y,转到 obs(i+1) 并重复。

【问题讨论】:

  • 关键是要确定你想如何选择“Major”的哪个值是正确的。剩下的很简单。

标签: arrays select sas overwrite


【解决方案1】:

假设您有一些规则可以确定哪个 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;

【讨论】:

  • 非常感谢!我几乎明白了。我将只运行代码,而不是立即尝试将其分解。我不知道我是否清楚地解释了自己,由于拼写问题,一个major_code 可能与两个专业匹配,但是两个major_code 值永远不会与一个专业匹配。错误肯定是一种方式。我不知道的主要技巧是通过排序和使用 first.id 引用,可以在所有主要代码中输出该对的两个选择之一。能够在排序后对内部组进行这样的操作,真的很强大。再次感谢你:)
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多