sas - 在SAS中的所有列上运行宏
问题描述
我有一个宏,我们称之为 %encoding(dataset, var),它对给定数据集中的一些分类变量 (var) 进行编码。
我想做的是为我的数据集中的所有字符变量运行这个宏,但我不知道该怎么做。我的集合有很多变量,所以手动编写它是不可能的。
解决方案
假设您需要物理更改此数据集中的所有字符变量。您可以轻松地data step
循环执行此操作。special 关键字_CHARACTER_
为您选择所有字符变量。将它们保存到一个数组中,您可以遍历它们。
data want;
set have;
array charvars[*] _CHARACTER_;
do i = 1 to dim(charvars);
charvars[i] = <logic goes here>;
end;
drop i;
run;
如果您需要更改多个变量的格式,proc datasets
这将是一种有效的方法。您可以使用相同的技巧。
proc datasets lib=libref nolist;
modify have;
format _CHARACTER_ <format here>;
quit;
下面的这个宏将指定的以空格分隔的变量列表更改为您指定的单一格式,但您可以轻松修改它以将特定格式与宏循环中的特定变量相关联。
%macro encoding(data=, vars=, format=);
%let data = %upcase(&data.);
/* Split out libname and dataset name */
%if(%scan(&data., 2, .) =) %then %do;
%let lib = WORK;
%let dsn = &data.;
%end;
%else %do;
%let lib = %scan(&data., 1, .);
%let dsn = %scan(&data., 2, .);
%end;
proc datasets lib=&lib. nolist;
modify &dsn.;
format &vars. &format.;
quit;
%mend;
例子:
data cars;
set sashelp.cars;
run;
%encoding(data=cars, vars=EngineSize Cylinders Horsepower, format=z5.);
推荐阅读
- reactjs - Jest 抛出错误“已接收:序列化为相同的字符串”
- postgresql - Codeigniter:如何在 for 循环中增加活动记录?
- android - 我如何才能收到 2 项活动的意向?
- kubernetes - 如何在 Kubernetes 中查看 API 访问日志?
- mysql - 如何优化 SQL 查询?
- c# - 触发 ComboBox SelectedValue 不起作用
- flutter - 'package:flutter/src/painting/_network_image_io.dart':断言失败:第 22 行 pos 14:'url != null':不正确
- sql-server - 如果在 SQL Server 中使用多个插入语句,则为 else
- java - 从 CLI 运行自定义 mojo 时,Maven 无法识别参数
- scikit-learn - ValueError:至少需要一个数组或数据类型 HistGradientBoostingRegressor