Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Stata:字符串变量的排列_Stata - Fatal编程技术网

Stata:字符串变量的排列

Stata:字符串变量的排列,stata,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

我有三个长度为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 |
+----+----+----+--------+--------+--------+--------+--------+--------+--------+--------+

好问题。我不知道是否有一种“内置”的方式来进行排列,但下面应该可以做到

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

不幸的是,这仍然需要您编写每个循环结构,但这应该足够简单,可以剪切粘贴查找替换

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
ed变量之一。请注意,如果您确实想要“drop one”排列,那么只需从
concat
调用中删除一个变量。这是因为“n permute n”与“n permute n-1”相同。也就是说,有6个3项的3项排列。也有6个2项的3项排列。所以

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

你的标题要求排列,但你的示例代码显示了重叠的子字符串,前4个和后4个。我对排列的理解是相同的(这里是字符串),顺序不同,没有不同(可能重叠)子字符串。此外,文本中的长度为2,代码中的长度为4。Mata中有函数可以进行排列,但这里似乎需要进行大量的澄清。感谢您指出这一点,我同意在以前的版本中字符串和变量可以互换使用,这很混乱。出于分析目的,我需要保留前导零每个变量。请注意,
gen perm1=x1+x5+x9
将比您拥有的更干净、更快。(我是
concat()
的原始作者,但这仍然是事实。)
concat()
egen
的函数采用变量名,而不是文字字符串。如果要连接文字字符串,只需添加它们。更一般地说,
concat()
在许多情况下,它对字符串加法没有任何好处。它的主要作用是系统地对数字变量和标点符号进行动态解码。哦,好的。这里的宏是变量名,不是吗?我就是找不到Stata“宏引号”为了显示在Markdown内联代码块中,所以我使用了常规引号。OP可以用字符串加法替换
concat
,我只是遵循他的方法(并且不知道区别:)。我也在努力解决这个问题。我使用了我所知道的唯一解决方案,编辑最后一行以更正语法。感谢你们的贡献,建议的解决方案非常有效!我已经相应地编辑了代码,这是我为SO调整示例时的错误。