【问题标题】:Create expandable varlist创建可扩展的 varlist
【发布时间】:2017-08-23 12:31:09
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • Condo_programmer 我的回答为您的问题提供了直接的解决方案。如果您认为它有帮助,请考虑支持/接受它。谢谢。

标签: matrix stata stata-macros


【解决方案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 以获取完整的语法详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多