在 SPSS 宏中循环遍历并行列表/数组

2023-12-19

我想编写一个SPSS宏来执行三个操作:

  1. 生成自定义表,
  2. 清洁输出窗口,
  3. 导出表。

如您所知,SPSS 宏工具允许使用两种类型的循环:“数字”,如 (!do !i = !x !to !y) 和 'list'/'for every' 像 (!do !i !in (!1))。我的目标是创建一个带有如下调用的宏:col v1 v2 / "Sheet A" "Sheet B".以这种方式工作(使用“列表”之类的循环):

  1. 获取第一个变量名称 (v1)
  2. 将其放入ctables宏观剖面
  3. 获取第一个工作表名称(字符串“Sheet A”)
  4. 将其放入output export宏观剖面
  5. 获取第二个变量名
  6. ...
  7. 获取第二个工作表名称
  8. ...

等等。

一开始我是这么写的:

define col (!positional !charend('/')
/!positional !cmdend)

!do !i !in (!1)

output close all.

  ctables
  /table x1 + x2
  by !i [mean f1.2, totals[mean f1.2]].

  output modify
  /select logs headings texts warnings pagetitles outlineheaders notes
  /deleteobject delete = yes.

!doend

!do !i !in (!2)

   output export
    /contents export = visible
    /xlsx documentfile = "E:\path\file.xlsx"
      operation = createsheet
      sheet = !i.

!doend

!enddefine.

*** MACRO CALL.
col v1 v2 / "Sheet A" "Sheet B".

输出总体上是不正确的,因为我只得到了带有第二个变量的表。但是,在文件中我发现了两张名称正确的工作表。所以,我尝试嵌套:

define col (!positional !charend('/')
/!positional !cmdend)

!do !i !in (!1)
!do !j !in (!2)

output close all.

  ctables
  /table x1 + x2
  by !i [mean f1.2, totals[mean f1.2]].

  output modify
  /select logs headings texts warnings pagetitles outlineheaders notes
  /deleteobject delete = yes.

   output export
    /contents export = visible
    /xlsx documentfile = "E:\path\file.xlsx"
      operation = createsheet
      sheet = !j.

!doend
!doend

!enddefine.

*** MACRO CALL.
col v1 v2 / "Sheet A" "Sheet B".

输出完全相同,这意味着 SPSS 将“/”左侧列表中的每个元素与“/”右侧列表中的每个元素交叉,并覆盖 Excel 文件中以前的结果。我的目标是接收这样的宏扩展:

* FIRST EXPANSION:
...
  ctables
  /table x1 + x2
  by v1 [mean f1.2, totals[mean f1.2]].
...
   output export
    /contents export = visible
    /xlsx documentfile = "E:\path\file.xlsx"
      operation = createsheet
      sheet = "Sheet A".

* SECOND (LAST) EXPANSION:
...
  ctables
  /table x1 + x2
  by v2 [mean f1.2, totals[mean f1.2]].
...
   output export
    /contents export = visible
    /xlsx documentfile = "E:\path\file.xlsx"
      operation = createsheet
      sheet = "Sheet B".

换句话说 - 2 列出 x 2 个元素,但只有两个循环 - 而不是四个。有谁知道如何得到这样的结果?


据我所知,没有正式/直接的方法可以在 SPSS 宏中的并行列表上运行循环,因此您的选择是 - 要么使用 Python,要么找到解决方法 - 这里有一些想法:

1. 使用数字循环重新创建两个列表
所以你循环数字 1 到 5,并使用它们来创建变量名称 - v1 到 v5 以及“工作表 1”到“工作表 5”:

!do !i=1 !to 5
.....
  by !concat("v",!i) [mean f1.2, totals[mean f1.2]].
.....
  sheet = !quote(!concat("sheet ",!i))
.....
!doend

如果它们不是常量,您还可以将开始和/或结束数字添加到宏调用中。
当然,只有当您的两个列表共享相同的编号(如上例所示)时,这才有效。如果没有,您可以使用以下方法之一:

2. 循环遍历一个列表,同时“吃掉”第二个列表
SPSS 宏循环一次仅迭代一个列表 - 但您可以在第一个列表的每次迭代中获取一个项目并将其从第二个列表中删除,而不是迭代第二个列表:

define col (!pos !charend('/') / !pos !cmdend)
!let !arr2=!2
!do !i !in(!1)
    .....
    by !i [mean f1.2, totals[mean f1.2]].
    .....
!let !sheet=!head(!arr2)
!let !arr2=!tail(!arr2)
    .....
    sheet = !sheet
    .....
!doend
!enddefine.

*and the macro call:
col VARa VARb VARc/"sheet 1" "sheet 2" "sheet 3".

3. 在单对上定义宏,使用多个宏调用这是最简单的方法,如果每个列表中只有几个项目 - 您可以使用单个变量名称和单个工作表名称定义宏,您将能够通过运行获得相同的结果 -

col VARa/ "sheet 1" .
col VARb/ "sheet 2" .

代替col VARa VARb/ "sheet 1" "sheet 2" .正如你之前尝试过的那样。

如果这些列表很长,您可以单独自动运行宏调用(使用write例如命令 - 但这是一个单独的问题)。

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

在 SPSS 宏中循环遍历并行列表/数组 的相关文章

随机推荐

  • iOS:如何在调试时观察 NSManagedObject 属性

    正如标题所说 我想调试一些 Core Data 的 bug 而不是使用NSLog在代码中的任何地方 是否可以在 XCode 4 的监视窗口中监视实体的属性 就像 NET的Entity Framework 4 0中的 快速监视 工具一样 任何
  • 为什么简单地使用 State monad 会导致堆栈溢出?

    我正在研究 State monad 我不知道是什么导致了这段简单代码中的堆栈溢出 import Control Monad State Lazy tick State Int Int tick do n lt get put n 1 ret
  • Google iOS 设备策略与使用 Google SSO 的 iOS 应用程序配合不佳

    我们构建了一个使用 Google 登录的 React Native 应用程序 我们用react native google signin并发布 ios 和 android 应用程序 在 Android 应用程序中登录 100 有效 它也适用
  • 在 JavaScript 中创建 DIV 图像 (GIF/PNG)

    我想知道是否有一个 JavaScript 库可以让我从 DIV 的内容生成图像 基本上 这是某些服务器端打印代码所必需的 它需要从浏览器打印背景 我最终想做的是将 DIV 内容编码为 PNG 格式 并通过打印操作发布编码数据 如果这可能的话
  • 如何调用从 C++ 导入的包中定义的 julia 方法?

    我需要一个 C 库来计算复杂参数的多伽玛函数 经过一番谷歌搜索后我发现了这一点 https scicomp stackexchange com questions 23194 i am searching for c code of the
  • 如何更改 PrimeFaces 中面板网格的列宽

    我正在使用 Java EE 和 PrimeFaces 如何更改 PrimeFaces 中面板网格的列宽 有例子吗 您可以使用columnClasses 限定panelGrid 内的列 以下代码设置不同的宽度并将单元格内容与顶部对齐
  • 使用jquery自动完成标签时的utf-8问题

    嘿伙计们 最近我使用jquery自动完成标签 http devthought com projects jquery textboxlist http devthought com projects jquery textboxlist 一
  • 检查字符串中的(仅整个)单词

    Checkio 上的培训 该任务称为流行词 任务是从给定字符串的 字符串 列表中搜索单词 例如 textt When I was One I had just begun When I was Two I was nearly new ww
  • 如何摆脱 PHP 注意:第 123 行 X 中的未定义索引:HTTPS

    我刚刚发现我有数千个此类错误 来自两个相同的文件 我通过使用删除了很多错误isset 但我不知道如何消除最后两个错误 也许你们可以帮助我 PHP Notice Undefined index HTTPS on xxx xxx xxx php
  • 如何验证脚本中的视频文件?

    我有一个包含大量视频文件的服务器 恢复后 我注意到几个文件的校验和发生了变化 由于我没有所有文件的校验和 因此我想编写一个脚本来验证文件完整性 对于档案来说很简单 tar t unzip t rar t等 或图像 convert image
  • 如何从 MSBuild 指定规则集

    升级到 VS 2010 MSBUILD p RunCodeAnalysis true 后无法按预期工作 msbuild solution sln p RunCodeAnalysis true 为了获得更快的构建 我们删除了 DEBUG 构建
  • 对 API 进行速率限制 (spring MVC)

    我正在寻找最有效的方法来实现 或使用已经设置的 速率限制器 以保护我所有的其余 api url 我正在寻找的保护是 每用户每秒调用限制器 我上网查了一下 结果是使用 Redis 或 Guava RateLimiter 说实话我没用过Redi
  • 请解释一下Android中的Context类

    我是安卓新手 有人可以向我解释一下 Context 类 对象的概念吗 这是什么 它将用来做什么 为什么是 Context 类 你见过吗安卓开发者指南 http developer android com reference android
  • 多个点能否组成一个圆? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我有例如20个点 我如何检查这些
  • 通过代码在换行单元格中插入换行符

    Is it possible to insert line break in a wrapped cell through VBA code similar to doing Alt Enter when entering data man
  • 当 React 已经渲染时无法刷新更新

    我试图在 API 返回错误时显示警报 对于警报窗口 我使用 sweetalert2 在我的渲染方法中 我正在检查错误消息是否包含内容 如果它包含错误消息 我想向用户显示警报 当我提交表单时 我会进行 API 调用 如果返回错误 reduce
  • 在 Linq 中返回单个列表属性 List

    我在这里遇到问题 我有一个列表 this Ddown 有 3 个属性 我想编写一个 Linq 查询来返回其中一个属性 假设我有属性 a b c 我想返回列表 c 我如何在 linq 中做到这一点 var listOfC this Ddown
  • 如何向直方图添加颜色条?

    I have a histogram like this just like a normal histogram 在我的情况下 总是有 20 个条形 x 轴从 0 到 1 并且条形的颜色是根据 x 轴上的值定义的 我想要的是添加一个色谱
  • TeamCity GitHub 私钥访问被拒绝

    有谁知道使用 TeamCity 与 github 和 ssh 私钥的教程 我尝试设置 git hub 进行连接 但要么出现身份验证错误 要么访问被拒绝 我在 Windows 2003 上运行 TeamCity 我将构建代理作为自定义帐户运行
  • 在 SPSS 宏中循环遍历并行列表/数组

    我想编写一个SPSS宏来执行三个操作 生成自定义表 清洁输出窗口 导出表 如您所知 SPSS 宏工具允许使用两种类型的循环 数字 如 do i x to y 和 list for every 像 do i in 1 我的目标是创建一个带有如