stata - 在 Mata 中使用 put_formula() 导出相对 Excel 引用
问题描述
我正在将大量字符串从 Stata 导出到 Excel。
对于每列3000+
具有不同字符串的行,我需要检查每个字符串/单元格的长度。我可以使用该length()
函数在 Stata 中执行此操作,但我需要能够打开 Excel 文件、编辑给定字符串并在 Excel 中自动更新长度。
这似乎使用putexcel
命令或 mata 的put_formula()
功能应该很简单,但运行时间令人望而却步。
从根本上说,我的问题是关于一次构建许多相对引用(例如,=LEN(A1)
)mata
,而不是一次一个。
看到下面的代码后,这可能更有意义:
mata: b = xl()
mata: b.create_book("Formula_Test", "Formula_Test", "xlsx")
mata: b.load_book("Formula_Test")
*Put some strings in column 1
mata: b.put_string(1, 1, "asfas")
mata: b.put_string(2, 1, "sfhds")
mata: b.put_string(3, 1, "qwrq")
mata: b.put_string(4, 1, "dgsdgsdgsdgs")
*Formula - export one-at-a-time
*This works, but is slow
foreach i of numlist 1/4{
mata: b.put_formula(`i', 2, "LEN(A`i')")
}
*Formula - export all at once with relative reference
*This would be faster, but throws error
mata: b.put_formula((1,4), 3, "LEN(INDIRECT("C[-2]",FALSE))")
当我运行最后一行时,出现错误:
invalid expression
r(3000);
mata
有没有一种有效的方法来使用, 和相对引用来编写整列或整行 Excel 公式?
解决方案
该mata
函数put_formula()
只接受行和列的标量。请注意,您还需要在其字符串矩阵参数中使用复合双引号。
在Stata中循环mata
总是比这样做更快:
mata:
for (i = 1; i <= 4; i++) {
b.put_formula(i, 2, `"LEN(INDIRECT("C[-2]",FALSE))"')
}
end
然而,尽管必须使用标量作为 中的行和列的参数的限制,put_formula()
实际上循环并不是必需的。这是因为可以指定一个J
常量字符串矩阵作为最后一个参数。
实际上,以下内容在几秒钟内完成相同的操作:
mata:
k = J(3000, 1, `"LEN(INDIRECT("C[-1]",FALSE))"')
b.put_formula(1, 2, k)
end
这样,矩阵在电子表格J[3000,1]
的单元格中写入一次。B1
因为它有3000
行,所以它自然会扩展到所有单元格,直到B3000
.
推荐阅读
- coldfusion - 在 ColdFusion 中加密/解密密码
- javascript - 使用 MAP 和 FILTER 根据 ID 映射数组并包含项目
- node.js - 在另一个 Node.js 应用程序中运行一个 Node.js 应用程序
- python - 尝试安装wire-server/ansible时出现此错误
- typescript - 在多仓库项目 Typescript 中从另一个存储库导入类型化对象
- node.js - 如何为 Stripe 或任何微服务 webhook 添加自定义端点?
- reactjs - 键入以使用 useState 挂钩访问 e.target.value
- excel - 条件格式替换为永久格式(Excel 日历)
- netsuite - 使用 Suitetalk 获取 SavedCsvImport XML 定义
- ios - 删除父记录时删除位于 Array 中的嵌套解析对象