0

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

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

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

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

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

4

1 回答 1

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

输入help dshelp unab从 Stata 的命令提示符获取完整的语法详细信息。

于 2018-12-10T17:27:10.657 回答