Matrix 创建可扩展变量列表

Matrix 创建可扩展变量列表,matrix,stata,stata-macros,Matrix,Stata,Stata Macros,我试图在Stata中将两个数据文件转换成一个矩阵 在第一个数据文件中,只有10列,因此我使用了: mkmat d1 d2 d3 d4 d5 d6 d7 d8 d9 d10, matrix(dataname) 但是,第二个数据文件包含超过100列 我是否必须在mkmat中手动包含所有变量名,或者有更好的方法来实现这一点?考虑以下示例: clear set obs 5 forvalues i = 1 / 5 { generate d`i' = rnormal() } list

我试图在Stata中将两个数据文件转换成一个矩阵

在第一个数据文件中,只有
10列
,因此我使用了:

mkmat d1 d2 d3 d4 d5 d6 d7 d8 d9 d10, matrix(dataname)
但是,第二个数据文件包含超过100列


我是否必须在
mkmat
中手动包含所有变量名,或者有更好的方法来实现这一点?

考虑以下示例:

clear
set obs 5

forvalues i = 1 / 5 {
    generate d`i' = rnormal()
}

list

     +-----------------------------------------------------------+
     |        d1          d2          d3          d4          d5 |
     |-----------------------------------------------------------|
  1. |  .2347558     .255076   -1.309553    1.202226   -1.188903 |
  2. |  .1994864    .5560354   -.7548561    1.353276   -1.836232 |
  3. |  1.444645   -1.798258    1.189875   -.0599763    .4022007 |
  4. |  .2568011    -1.27296    .5404224   -.1167567    1.853389 |
  5. | -.4792487     .175548    1.846101    .4198408   -1.182597 |
     +-----------------------------------------------------------+
您可以简单地使用通配符:

mkmat d*, matrix(d)

或者,可以使用命令
ds
unab
创建本地宏,其中包含符合条件的变量名列表,然后可以在
mkmat
中使用:

ds d*

mkmat `r(varlist)', matrix(d1)
matrix list d1

d1[5,5]
            d1          d2          d3          d4          d5
r1   .23475575   .25507599  -1.3095527   1.2022264  -1.1889035
r2   .19948645    .5560354  -.75485611   1.3532759  -1.8362321
r3   1.4446446  -1.7982582   1.1898755   -.0599763    .4022007
r4   .25680107  -1.2729601   .54042244  -.11675671   1.8533887
r5  -.47924873     .175548    1.846101   .41984081  -1.1825972

ds
的优点是,它可以使用其
has()
not()
选项进一步过滤结果

例如,如果某些变量是字符串,
mkmat
会抱怨:

tostring d3 d5, force replace
mkmat d*, matrix(d)
string variables not allowed in varlist;
d3 is a string variable
但是,以下方法可以很好地工作:

ds d*, has(type numeric)
d1  d2  d4

mkmat `r(varlist)', matrix(d)

matrix list d

d[5,3]
            d1          d2          d4
r1  -1.5934615   2.1092126  -.99447298
r2  -.51445526  -.62898564   .56975317
r3  -1.8468649  -.68184066   .26716048
r4  -.02007644  -.29140079   2.2511463
r5  -.62507766    .6255222   1.0599482

从Stata的命令提示符中键入
help ds
help unab
,以获取完整的语法详细信息。

Condo_程序员我的回答为您的问题提供了一个直接的解决方案。如果你认为有帮助的话,请考虑接受/接受。谢谢
tostring d3 d5, force replace
mkmat d*, matrix(d)
string variables not allowed in varlist;
d3 is a string variable
ds d*, has(type numeric)
d1  d2  d4

mkmat `r(varlist)', matrix(d)

matrix list d

d[5,3]
            d1          d2          d4
r1  -1.5934615   2.1092126  -.99447298
r2  -.51445526  -.62898564   .56975317
r3  -1.8468649  -.68184066   .26716048
r4  -.02007644  -.29140079   2.2511463
r5  -.62507766    .6255222   1.0599482