如何在更新宏变量的数据步骤中调用宏并立即使用该值?

2024-04-11

下面的例子非常简单,可能可以用更简单的方式解决。不过,我有兴趣让它发挥作用。以下示例基于 sashelp-library 的 cars-dataset。首先,我有一个名为 fun 的宏:

proc contents data = sashelp.cars out = mycontents;
run;

%macro fun(var);
proc sql noprint;
        select count(distinct(&var.))
        into :obs
        from sashelp.cars;
quit;
%mend;

现在我想调用宏,但只想更新 obs(从输入语句)。我用:

data work.test;
set mycontents;
if name ne "Type" then do;
      call execute('%nrstr(%fun('||name||');');
      new = &obs;
end;
else new = 5;

run;

简而言之,这应该迭代 mycontent 的行。然后根据名称调用一个(多个)宏,这会更新 obs。然后我可以简单地用 obs 填充新列 new 。但是,obs 对于所有名称都保持相同的值,即最后一个变量的值。


这里的问题是双重的。

首先,你不能使用CALL EXECUTE在这种情况下,因为它不会执行,直到after数据步骤已完成运行:所以任何事情都取决于&obs将无法获得更新的值。你必须使用dosubl https://support.sas.com/resources/papers/proceedings13/032-2013.pdf.

其次,你需要使用symget('obs'), not &obs,如果您想获取中间数据步骤的更新值。&obs将在编译数据步骤时解析,因此在执行期间无法更改;但symget(obs)指示数据步骤在执行期间查询符号表。

这是执行此操作的示例dosubl,与您的示例相比变化很小。请注意%global声明以确保obs我们可以在数据步骤中使用(还有其他更好的方法可以将其返回 - 即,将其包装在fcmp功能及使用run_macro- 但这最接近你的做法)。

proc contents data = sashelp.cars out = mycontents;
run;

%macro fun(var);
%global obs;
proc sql noprint;
        select count(distinct(&var.))
        into :obs
        from sashelp.cars;
quit;
%mend;

data work.test;
set mycontents;
if name ne "Type" then do;
      rc = dosubl(cats('%fun(',name,')'));
      new = symgetn('obs');
end;
else new = 5;
run;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在更新宏变量的数据步骤中调用宏并立即使用该值? 的相关文章

  • SAS 中的退出与运行语句

    在 SAS 中 退出 和 运行 有什么区别 声明 我不知道何时使用 退出 以及何时使用 运行 例如 为什么是proc datasets using quit but proc contents using run 这可以追溯到 SAS 曾经
  • 如何在一个proc打印语句中打印多个数据集?

    我有一个 sas 查询 如果我创建了 3 个数据集 可以说命名为ds1 ds2 ds3 现在 我想在一个 proc print 语句下打印所有这些 那么我们该怎么做呢 就像 我想要这样的东西 proc print data work ds1
  • 何时在 SAS 中使用 IF 或 %IF

    我是 SAS 新手 很难弄清楚何时应使用简单的 If Then else 以及何时应使用 IF THEN ELSE 作为示例代码如下 let inFile scan sysparm 1 macro read data infile data
  • SAS:使用 PROC IMPORT 导入 .xlsx 时定义类型

    问题 使用 PROC IMPORT 时如何定义从 xlsx 文件导入的变量的变量类型 My work 我正在使用 SAS v9 4 据我所知 它是普通的 SAS 我没有 SAS ACCESS 等 我的数据如下所示 ID1 ID2 MONTH
  • 为当前的下一行数据编写脚本

    如果我想复制下一行的数据该怎么办 例如 客户 A 于 2015 年 1 月 1 日开始当前行程 下一次行程于 2015 年 1 月 15 日开始 因此 他当前行程的结束日期将为 2015 年 1 月 14 日 即下一次行程开始的前一天 我可
  • 拆分 SAS 数据集

    我有一个 SAS 数据集 如下所示 id dept 1 A 2 A 3 A 4 A 5 A 6 A 7 A 8 A 9 B 10 B 11 B 12 B 13 B 每个观察代表一个人 我想将数据集分成 团队 数据集 每个数据集最多可以有 3
  • 有效地重新格式化数据布局

    我有几个 Excel 电子表格 其数据布局如下raw data https i stack imgur com QOju9 jpg company company1 company2 company3 currency Y E 1 1 20
  • SAS 我可以逆向进行 sas 过程观察吗

    我知道Sas在处理时从数据集顶部的观察开始 然后继续进行下一个直到到达底部观察 但是有没有一种简单的方法可以让sas首先处理底部观察 然后再处理到顶部 您可以使用nobs and point向后处理它 而无需执行任何中间步骤 这是一个例子
  • 使用 Teradata ODBC 与 Teradata 数据库的 SAS 连接

    我正在尝试连接到 SAS 中的 Teradata 我在机器上设置了 Teradata ODBC 目前我的假设是使用 ODBC 是我访问数据库的唯一方法 这是我的连接命令的语法 库名称 Teradata ODBC dsn dsnname ui
  • 在 Stata 中进行加权热甲板插补的简单方法?

    我想在 Stata 中进行简单的加权热甲板插补 在 SAS 中 等效命令如下 请注意 这是一个较新的 SAS 功能 从 2015 年左右的 SAS STAT 14 1 开始 proc surveyimpute method hotdeck
  • SAS 哈希表:有没有办法在不同的键上查找/连接或具有可选键

    我经常处理一些键不完美的数据 并且我需要连接来自不同源的数据 我想继续使用哈希对象以获得速度优势 但是当我使用大量数据时 我可能会遇到崩溃 记忆限制 一个简单的概述是我有 2 个不同的键 它们都是唯一的 但并非每条记录都存在 我们将它们称为
  • 使用宏对数据集中的列按组求和

    我有一个数据集 如下所示 Month Cost Center Account Actual Annual Budget June 53410 Postage 13 234 June 53420 Postage 0 432 June 5343
  • 如何使用 proc Compare 更新数据集

    我想用proc compare每天更新数据集 work HAVE1 Date Key Var1 Var2 01Aug2013 K1 a 2 01Aug2013 K2 a 3 02Aug2013 K1 b 4 work HAVE2 Date
  • SAS SQL 传递

    我想知道在这段代码中 SAS SQL 传递中首先执行的是什么 Connect To OLEDB As MYDB DBConnect Catalog MYDB Create table MYDB extract as select put P
  • 获取 SAS 表元数据 URI 的通用方法

    我正在构建一个利用表对象的 SAS 元数据 ID 或 URI 的实用程序 当库使用 BASE 引擎时 以下代码可以很好地获取 ID let mylib SOMELIB data output keep uri dataname length
  • SAS 全球日期比较

    我正在尝试进行日期比较 但没有得到正确的结果 有谁知道发生了什么事吗 macro ttt let check start 28APR2014 if check start d lt 25may2014 d then let true 1 e
  • 如何在SAS中删除重复的记录\观察而不进行排序?

    我想知道是否有办法取消重复记录WITHOUT排序 有时候 我想保留原来的顺序 只想删除重复的记录 是否可以 顺便说一句 以下是我对不重复记录的了解 它最终会进行排序 1 proc sql create table yourdata nodu
  • 使用 SAS EG 通过代理从 API 下载 JSON 文件

    我正在尝试使用瑞士当局提供的 API 对公司网络内的地址进行地理编码 我的公司使用带有用户名和密码的代理服务器 我是 SAS EG 的新手 这是我迄今为止拥有的代码 我必须匿名一些内容才能被允许在此处发布 filename response
  • 使用 SAS 导出到 Excel

    假设我有 2 个 SAS 数据集 test1 sas 和 Test2 sas 现在我想将这2个数据集导出到Excel中 其中Excel文件Sheet1中将有test1 sas数据 Sheet2中将有test2 sas数据 怎么做 从 开始这
  • 输出带有SAS表测试结果的表的宏

    Problem 我不是一个非常有经验的 SAS 用户 但不幸的是我可以访问数据的实验室仅限于 SAS 另外 我目前无法访问这些数据 因为它只能在实验室中使用 因此我创建了模拟数据进行测试 我需要创建一个宏来获取值和尺寸PROC MEANS表

随机推荐

  • 即使出现重复键错误,Pymongo 也会插入 id

    我正在开发一个 Flask 应用程序并使用 mongodb 在一个端点中 我获取了 csv 文件并将内容插入到 mongodb 中insert many 在插入之前 我创建一个唯一索引以防止 mongodb 上的重复 当没有重复时我可以到达
  • 将文本预测脚本 [Markov Chain] 从 javascript 转换为 python

    过去几天我一直在尝试转换这个js脚本 http blog javascriptroom com 2013 01 21 markov chains 到Python代码 到目前为止我的实现 主要是blindfull cp 一些小的修复 impo
  • Tensorflow 2:如何在 GPU 和 CPU 之间切换执行?

    In tensorflow1 X 独立keras2 X 中 我曾经使用以下代码片段在 GPU 上的训练和 CPU 上运行推理之间切换 由于某种原因 我的 RNN 模型速度要快得多 keras backend clear session de
  • Cosmosdb sql api 和 Cosmosdb cassandra api 之间的存储差异是什么

    大多数文章都提到 如果我们使用 Cosmos Db 并新创建我们的应用程序 我们应该使用 Cosmos db sql api 当您已经将应用程序与实际的 mongo 和 cassandra 集成并且我们希望快速迁移到 cosmosdb 并且
  • 不带端口的 SQL Server 命名实例远程连接

    我有一个 SQL Server Express 的命名实例 我想让它在网络上可见 我能够做到这一点 但其他机器只能连接到指定端口号 即使它是默认端口 例如 其他机器可以使用以下方式连接到我的机器 1433 是 SQL Server 的默认端
  • CSS:可以将 Webkit 滚动条“推”到内容中吗?

    通常滚动条的位置如下 content scrollbar 我基本上希望在 自定义 滚动条和可
  • 在 iOS 中以编程方式清空缓存

    有谁巧合地知道我如何清空我正在开发的iOS应用程序的缓存内存 在它进入后台 applicationDidEnterBackground 的那一刻 我已经调查了 NSCache 但我仍然无法理解如何检索缓存以基本上删除 释放它 你说的是这个吗
  • powerpoint vba将某些幻灯片导出为pdf

    我试图在调用此函数时将选定的幻灯片导出为 pdf 这段代码运行得非常好 但给我的是整个幻灯片的 PDF 格式 Sub Export to PDF ActivePresentation ExportAsFixedFormat ActivePr
  • 最小购物车金额(WooCommerce 中的特定产品除外)

    我只允许在我的网站上进行最低价值 15 欧元的订单 但希望对一种产品进行例外处理 如果有人知道如何在这方面帮助我 我将非常感激 最小订单值的编码如下 有人知道我如何调整它以通过产品 ID 排除一种产品吗 add action woocomm
  • 内存中的方法表示是什么?

    在思考一下 Java C 编程时 我想知道属于对象的方法如何在内存中表示 以及这一事实如何涉及多线程 是为内存中的每个对象单独实例化一个方法还是执行 同一类型的所有对象共享该方法的一个实例 如果是后者 执行线程如何知道哪个对象是 要使用的属
  • PHP 发送的 ZIP 存档已损坏

    我正在使用 php ZipArchive 即时创建 zip 文件并将其发送回用户 我将压缩文件暂时存储在文档根目录上方的文件夹中 然后将其与代码一起发回 header Content type application zip header
  • 何时使用 $ 何时不使用

    我使用以下变量选择了一个控件 var txt text1 现在 当我必须处理文本框上的事件时 我是否必须将其引用为 txt 或 txt 即可 txt keydown function or txt keydown function 有什么好
  • 为什么 File::isDirectory 作为 FileFilter 可以正常工作?

    Why 文件 是目录在下面的示例中 作为 FileFilter 工作正常吗 File files new File listFiles File isDirectory listFiles方法需要一个FileFilter作为参数 publi
  • Android ActionBar 重新创建选项菜单

    在Android中使用ActionBar时 如何刷新选项菜单 我尝试隐藏和显示该栏 并使用 getSupportActionBar 获取它的新实例 我正在尝试实现一个登录 注销按钮 该按钮将根据用户的状态动态更改 这是我的 onCreate
  • Google Big-query api 403-禁止异常

    当我使用 Big Query API 的 java 应用程序执行查询时 出现以下 JSON 异常 以下是我得到的异常 error errors domain global reason accessDenied message Access
  • 使用 regexp_substr 选择逗号之间的单词(不包括双引号)

    我试图从逗号分隔列表中返回字符串列表 但是 我仍然想返回字符串中出现在双引号之间的逗号 这是我目前的声明 SELECT regexp substr one two three four five six seven eight nine n
  • Jquery Draggables:删除元素会更改其他删除元素的位置

    当放置 放置元素 通过从一个 DIV 拖动到另一个 DIV 然后删除放置的 DIV 中的一个元素时 其中一些元素会更改位置 这是一个测试场景 http jsfiddle net TcYHW 8 http jsfiddle net TcYHW
  • 你已经从颠覆转向善变了吗?值得付出努力吗?

    我正在更好地了解 Mercurial 版本控制系统 并且正在考虑从 SVN 进行转换 有人已经转换了吗 对于您和您的团队来说 转变是否困难 您能否给出一些建议 是继续使用 SVN 还是选择 Mercurial 一旦开始 你就永远不想回去 优
  • Gnuplot脚本创建后消失

    我有一个 gnuplot 脚本 我的系统是ubuntu 14 04 当我在终端输入gnuplot myPlot 剧情将会消失 它不会保留在屏幕上 我在这个堆栈中看到了类似的question https stackoverflow com q
  • 如何在更新宏变量的数据步骤中调用宏并立即使用该值?

    下面的例子非常简单 可能可以用更简单的方式解决 不过 我有兴趣让它发挥作用 以下示例基于 sashelp library 的 cars dataset 首先 我有一个名为 fun 的宏 proc contents data sashelp