sql - 基于每个变量的 SAS 查找
问题描述
我在 SAS 中有两个表,表 A 和表 B。假设我想编写一点 SAS 代码来获取表“Desired Output”。我该怎么做?
表 A:
Observation Var1 Var2
1 0 0
2 1 2
3 2 1
4 0 0
表 B:
Var Level Lookup
Var1 0 0.1
Var1 1 0.3
Var1 2 0.5
Var2 0 0.7
Var2 1 0.8
Var2 2 0.9
期望的输出:
Observation Var1 Var2 Var1_new Var2_new
1 0 0 0.1 0.7
2 1 2 0.3 0.9
3 2 1 0.5 0.8
4 0 2 0.1 0.9
据我了解,这可能涉及 SAS 中的 SQL,但我不确定。我不知道该怎么做。伪代码可能看起来像这样,但我不知道如何真正让它工作:
data DATA_OUT.DESIRED_OUTPUT;
set DATA_IN.TABLE_A;
set PP.TABLE_B key=(Var Level);
Var1_new = TABLE_B["Var1" Var1][Lookup];
Var2_new = TABLE_B["Var2" Var2][Lookup];
run;
您将如何在 SAS 中实现所需的输出?
解决方案
大约有十几种方法可以做到这一点,但最好的方法可能是从第二个数据集制作格式。
格式只是一个值和另一个值之间的关系,这正是您在这里所拥有的!您使用 PROC FORMAT 上的 CNTLIN 选项从数据集(您的数据集 B)创建关系,然后使用 PUT 应用它。(然后使用 INPUT 改回数字 - 格式仅创建字符值。您不能在此处使用 INFORMAT,因为它们仅将字符值作为输入。数字到数字总是需要额外的步骤。)
您还可以使用哈希表查找,或者只是一对数据步骤合并,或键控集语句......很多选项,以及 SQL 连接。但是这里的格式将是最快和最容易编码 IMO 的。
data a;
input Observation Var1 Var2;
datalines;
1 0 0
2 1 2
3 2 1
4 0 0
;;;;
run;
data b;
input Var $ Level Lookup;
datalines;
Var1 0 0.1
Var1 1 0.3
Var1 2 0.5
Var2 0 0.7
Var2 1 0.8
Var2 2 0.9
;;;;
run;
*Here we make a new dataset that has the required names for a format cntlin dataset;
data for_fmt;
set b;
rename var=fmtname
level=start
lookup=label
;
var = cats(var,'F'); *format names cannot end with numbers, so add an F at the end;
run;
proc format cntlin=for_fmt; *read in the format;
quit;
*now use the formats;
data want;
set a;
var1_new = input(put(var1,var1f.),best12.);
var2_new = input(put(var2,var2f.),best12.);
run;
推荐阅读
- cassandra-3.0 - 如何使用 QueryBuilder 创建需要更新 UDT 值的更新语句
- python - 无法获得 Python 多处理数组输出的完整副本
- node.js - 在 AWS 上使用 Python 脚本调用 NodeJS 应用程序时未捕获(承诺)
- asp.net-core - 如何修复.net核心中的中间件问题
- python - 在按下 Enter 之前,带有 PIPE 标准输出的 Popen 不会退出
- typescript - 将一个目录中的所有文件分组到一个别名下
- java - 是否可以使用 replaceAll() 函数来创建一个在其上下文中包含 \n 的字符串?
- rust - 如何在等效枚举类型之间进行转换?
- flutter - Image.asset 未出现在 Android 模拟器上,但在连接的设备上工作
- swift - 计算从两个 UIDatePickers Swift 4 中选择的日期的值