Stata:字符串变量的排列

时间:2014-03-27 02:06:55

标签: stata

我有三个长度为2的字符串变量,我需要得到(a)三个变量的所有可能的排列(保持每个变量中的字符串顺序固定),(b)所有可能的变量对。少数变量允许我手动完成,但我想知道是否有更优雅和简洁的解决方法。

目前编码为:

egen perm1 = concat(x1 x5 x9)
egen perm2 = concat(x1 x9 x5)
egen perm3 = concat(x5 x1 x9)
egen perm4 = concat(x5 x9 x1)
egen perm5 = concat(x9 x5 x1)
egen perm6 = concat(x9 x1 x5)

gen tuple1 = substr(perm1,1,4)
gen tuple2 = substr(perm2,3,4)
gen tuple3 = substr(perm3,1,4)
gen tuple4 = substr(perm4,3,4)...

结果表中的摘要说明了所需的结果:

 +----+----+----+--------+--------+--------+--------+--------+--------+--------+--------+
| x1 | x5 | x9 | perm1  | perm2  | perm3  | perm4  | perm5  | perm6  | tuple1 | tuple2 |
+----+----+----+--------+--------+--------+--------+--------+--------+--------+--------+
| 01 | 05 | 09 | 010509 | 010905 | 050109 | 050901 | 090501 | 090105 |   0105 |   0509 |
+----+----+----+--------+--------+--------+--------+--------+--------+--------+--------+

1 个答案:

答案 0 :(得分:1)

整洁的问题。我不知道是否有#34;内置"做排列的方法,但以下应该这样做。

您希望遍历所有变量,但请确保不要重复。随着尺寸的增加,这变得棘手。我做的是在同一个列表上循环,每次都从嵌套循环的计数器空间中删除当前计数器。

不幸的是,这仍然需要你编写每个循环结构,但这应该很容易切割 - 粘贴 - 查找 - 替换。

clear
set obs 100
generate x1 = "01"
generate x5 = "05"
generate x9 = "09"

local vars x1 x5 x9
local i = 0
foreach a of varlist `vars' {
    local bs : list vars - a
    foreach b of varlist `bs' {
        local cs : list bs - b
        foreach c of varlist `cs' {
            local ++i
            egen perm`i' = concat(`a' `b' `c')
        }
    }
}

修改:重新阅读问题,我不清楚你想要什么(因为row1_1不是你的concat个变量之一。请注意,如果你真的希望"删除一个"排列,然后从concat调用中删除一个变量。这是因为" n置换n"与" n置换相同n-1"。也就是说,有3个项目有6个3项排列。还有6个项目排列3个项目。所以

egen perm`i' = concat(`a' `b')