首页 > 解决方案 > 在 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 公式?

标签: stata

解决方案


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.


推荐阅读