如何根据 SAS Enterprise Guide / PROC SQL 中具有相同前缀的列中的值创建具有适当前缀的 2 个新列?

2024-01-10

我在 SAS Enterprise Guide 中有如下表:

ID   | COUNT_COL_A | COUNT_COL_B | SUM_COL_A | SUM_COL_B
-----|-------------|-------------|-----------|------------
111  | 10          | 10          | 320       | 120
222  | 15          | 80          | 500       | 500
333  | 1           | 5           | 110       | 350
444  | 20          | 5           | 670       | 0

要求:

  • 我需要创建新列“TOP_COUNT”,其中将是每个 ID 具有最高值的列名称(COUNT_COL_A 或 COUNT_COL_B),

    • 如果某个 ID 在两个“COUNT_”列中具有相同的值,则采用“TOP_COUNT”列名称,该列名称在其对应的前缀 SUM_(SUM_COL_A 或 SUM_COL_B)中具有更高的值
  • 我需要创建新列“TOP_SUM”,其中将是每个 ID 具有最高值的列名称(SUM_COL_A 或 SUM_COL_B),

    • 如果某个 ID 在两个“SUM_”列中具有相同的值,则采用“TOP_SUM”列名称,该名称在其对应的具有前缀 COUNT_(COUNT_COL_A 或 COUNT_COL_B)的对应项中具有更高的值

前缀为 _COUNT 的列中不可能只有 0,前缀为 _SUM 的列中不可能只有 0

表中不存在空值

期望输出:

ID   | COUNT_COL_A | COUNT_COL_B | SUM_COL_A | SUM_COL_B  | TOP_COUNT   | TOP_SUM
-----|-------------|-------------|-----------|------------|-------------|---------
111  | 10          | 10          | 320       | 120        | COUNT_COL_A | SUM_COL_A 
222  | 15          | 80          | 500       | 500        | COUNT_COL_B | SUM_COL_B  
333  | 1           | 5           | 110       | 350        | COUNT_COL_B | SUM_COL_B  
444  | 20          | 5           | 670       | 0          | COUNT_COL_A | SUM_COL_A 

我如何在 SAS Enterprise Guide 或 PROC SQL 中执行此操作?


使用带有循环方法的数组:

  • 声明计数变量的数组
  • Set the maximum value to 0
    • 循环遍历数组
  • 检查每个值是否大于当前值 最大限度
  • If yes, assign value to current maximum value and store name
    • 如果没有,继续循环

非循环,函数方法论:

  • 使用MAX求数组的最大值
  • 使用 WHICHN() 查找数组的位置
  • 使用VNAME根据位置获取变量名
*for count - you can extend for max;
data want;
    set have;

   array _count(*) count_col_:;

    *looping methodology;
    top_count_value=0;
    do i=1 to _count;
       if _count(i) > top_count_value then do;
          top_count = vname(_count(i));
          top_count_value = _count(i);
        end;
      end;

   /*or function methodology*/
   top_count_max = max(of _count(*));
   index_top_count = whichn(top_count_max, of _count(*));
   top_count_name_2 = vname(_count(index_top_count);

run;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何根据 SAS Enterprise Guide / PROC SQL 中具有相同前缀的列中的值创建具有适当前缀的 2 个新列? 的相关文章

  • 北欧航空公司。变量是否在数据步骤的每次迭代中都设置为缺失?

    我一直认为数据步骤的每次迭代都将变量设置为缺失 然而 在下面的代码中 变量看起来像是保留了最开始获取的值 我不明白为什么会发生这种情况 data one input x y datalines a 10 a 13 a 14 b 9 run
  • 在SAS中运行程序的热键?

    我知道在 R 中我可以使用 control r 来运行我的程序代码 我想知道 SAS 中是否有等效的热键 如果没有 有没有办法将其 编程 到 SAS 中 运行 提交程序 的默认热键是 F8 键 如果您使用的是 Base SAS 不是 EG
  • 在 Base SAS 中,如何自动刷新资源管理器?

    我相当确定这一定是困扰其他人的问题 因此必须有一个解决方案 我编写代码并想要快速检查数据集 但它不存在 我需要选择窗口 单击 查看 然后单击 刷新 是否有我可以使用的键盘快捷键或我可以编写的宏来为我做到这一点 我知道这很懒 但它让我烦恼 任
  • SAS数字到字符的转换?

    当我们将数字转换为字符时 我们应该使用如下的数字格式 data test prodID 001 result put prodID 1 run proc print run 我也尝试过使用字符格式 1 而且它也有效 data test pr
  • 使用 Teradata ODBC 与 Teradata 数据库的 SAS 连接

    我正在尝试连接到 SAS 中的 Teradata 我在机器上设置了 Teradata ODBC 目前我的假设是使用 ODBC 是我访问数据库的唯一方法 这是我的连接命令的语法 库名称 Teradata ODBC dsn dsnname ui
  • 将 CSV 中的所有列导入为字符?

    简单的问题 PROC IMPORT OUT braw address DATAFILE path address data csv DBMS csv REPLACE GETNAMES YES RUN 该语句将创建数据集列作为字符or数字取决
  • SQL:对每个设备集连续出现相同值的所有记录进行计数并返回最高计数

    我想找出特定分区的特定值连续出现的次数 然后显示该分区的较高计数 例如 如果下表是 Device ID speed DateTime 07777778999 34 18 12 2016 17 15 07777778123 15 18 12
  • 以批处理模式运行时提示输入 SAS ODBC 连接密码

    由于各种原因 我更喜欢尽可能以批处理模式运行 SAS 程序 出于安全原因 我希望每当与 Teredata 仓库建立 ODBC 连接时 SAS 都会提示我输入密码 我可以同时拥有这两个东西吗 以下代码在从 SAS 交互运行时工作正常 但在批量
  • 如何将 MongoDB 查询转换为字典

    我的 MongoDB 中有一个集合 userId 1234 name Mike userId 1235 name John 我想得到表格的结果 dict userId document 换句话说 我想要一个结果 它是一个字典 其中userI
  • 将 SAS 数据集中的观测值读入数组

    这个问题与大型机上的 SAS 相关 尽管我相信在这种情况下没有什么区别 我有以下 SAS 数据集 Obs DATO T ALLOC T FRESP 1 19328 647 1804 2 19359 654 1797 3 19390 662
  • 在双边案例交叉设计中创建控制日期

    我计划研究空气污染对急诊室就诊的影响 并打算使用双边病例交叉设计 对于每个病例 医院就诊 我想创建 4 个控制日期 就诊前后 7 天和 14 天 例如 如果一个人于 2012 年 9 月 10 日访问诊所 我的控制日期将为 8 月 27 日
  • 从 .Net 中的 SAS 数据源读取数据

    我被要求在 ASP Net 应用程序中从 SAS 读取一些数据 我有 Windows 窗体应用程序的工作代码 然而相同的代码doesn t在 ASP Net 中工作 但我可以尝试一下 具有相同引用的干净项目始终会失败 这是我所得到的连接 S
  • XPT 到 CSV 的转换? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 也许这是错误的地方 但我不太确定该把它放在哪里 我有一个非常大的 XPT 格式的压缩 SAS 文件 我
  • 增加 sas 内存/memsize

    您好 有一个包含大约 6000 个观测值和 250 个变量的数据集 我正在尝试使用 proc mix 在 sas 中运行混合模型 但我不断收到 错误 由于内存不足 sas 系统停止处理此步骤 我尝试了康奈尔大学的方法 http www ci
  • 按类型限制 ElasticSearch 聚合?

    如何针对特定类型执行 ElasticSearch 聚合 我意识到您可以在请求 URL 中指定索引和 或类型 但我想对两种不同的类型执行聚合 谢谢你 您可以按类型过滤聚合 然后使用子聚合 例如 aggs Test 1 filter type
  • 使用 COMMAw,d 转换数字

    我正在关注SAS 帮助页面 http support sas com documentation cdl en lrdict 64316 HTML default viewer htm a000200667 htm并试图获得与页面底部示例相
  • SAS:如何计算除某些字符变量之外的所有字符变量的频率

    我知道我可以使用类似以下内容来计算所有字符的频率 proc freq data sashelp class tables char run 但是 有没有办法排除一些变量呢 我想做类似的事情 proc freq data sashelp cl
  • SAS Do 循环:在循环内使用循环变量来创建滞后变量

    我想创建包含给定变量的滞后值的变量 以实现大量滞后 我怎么能这样做呢 我尝试以下操作 data out set in do i 1 to 50 let j i lag j Lag j x end run 如何获取循环变量i进入宏变量j或者如
  • SAS,按组求和

    我想通过var1计算总和 你能用两种方法来计算吗 SQL 和数据步骤使用 if first var1 data have input var1 var2 var3 datalines 1 a 3 1 a 4 1 a 3 2 b 5 2 b
  • 在从一个表中提取的循环内调用执行以执行宏

    我目前有以下情况 macro sqlloop event id lots of code mostly proc sql segments mend 生成一个输出表 名为export table2 我需要能够为另一个表 名为 vars 中的

随机推荐