创建可扩展的varlist

时间:2017-08-23 12:31:09

标签: matrix stata stata-macros

我尝试将两个数据文件转换为Stata中的矩阵。

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

mkmat d1 d2 d3 d4 d5 d6 d7 d8 d9 d10, matrix(dataname)

但是,第二个数据文件包含多个100列。

我是否必须手动在mkmat中包含所有变量名称,或者有更好的方法来执行此操作?

1 个答案:

答案 0 :(得分:1)

考虑以下玩具示例:

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)

mkmat d?, matrix(d)

或者,可以使用命令dsunab创建包含包含合格变量名称列表的本地宏,然后可以在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

unab varlist : d*

mkmat `varlist', matrix(d2)
matrix list d2

d2[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 dshelp unab,以获取完整的语法详细信息。