Matrix 创建可扩展变量列表
我试图在Stata中将两个数据文件转换成一个矩阵 在第一个数据文件中,只有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
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