我需要生成整数1,2,3,4的所有可能元组(每个元组中恰好有2个项目)。然后,我需要generate
一组对应于产生了六个元组。每个变量名都应包含对元组的引用,每个变量的值应该是元组本身的字符串版本,如下所示:
+--------+--------+--------+--------+--------+--------+
| var_12 | var_13 | var_14 | var_23 | var_24 | var_34 |
+--------+--------+--------+--------+--------+--------+
| 12 | 13 | 14 | 23 | 24 | 34 |
+--------+--------+--------+--------+--------+--------+
虽然使用tuples
用户编写的命令生成元组(有关详细信息,请参阅http://ideas.repec.org/c/boc/bocode/s456797.html),但我在生成新变量并在循环中为它们赋值时遇到了绊脚石。代码如下所示,导致语法错误,这可能源于错误地使用本地元组宏,如果有人能帮助我解决它,我将非常感激。
tuples 1 2 3 4, display min(2) max(2)
forval i = 1/`ntuples' {
gen v`i'=`tuple`i''
rename v`i' var_`tuple`i''
}
答案 0 :(得分:4)
tuples
是来自SSC的用户编写的命令。在www.statalist.org处,您需要解释它的来源,这也是一个非常好的主意。
在你的情况下,你想说12之类的整数代表一个元组,如“1 2”,但后者在创建数字变量时看起来与Stata格式不一致。即使所有出现的字符都是数字,Stata肯定也不会忽略这些空间。所以你需要明确地这样做。同名给变量一个名称然后立即重命名它可以被压缩。
forval i = 1/`ntuples' {
local I : subinstr local tuple`i' " " "", all
gen var_`I' = `I'
}
为包含空格的元组创建字符串变量会使其成为不必要的一部分,但变量名中仍然不允许使用该空格:
forval i = 1/`ntuples' {
local I : subinstr local tuple`i' " " "_", all
gen var_`I' = "`tuple`i''"
}
如果这是你的整个问题,那么写出6个generate
语句会更快!如果这是一个代表更大事物的玩具问题,请注意说“1 23”和“12 3”都将映射到“123”,因此只有单个数字整数才能明确区分这些空格;因此,持有字符串的吸引力。
我仍然很好奇如何在变量的每个观察中保持相同的元组是一个好主意;也许通过使用字符串标量或本地宏本身可以更好地满足您的更大目的。