Condo_programmer
Condo_programmer

Reputation: 236

Create expandable varlist

I tried to convert two data files into a matrix in Stata.

In the first data file there are only 10 columns, so I used:

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

However, the second data file contains more than 100 columns.

Do I have to manually include in mkmat all variable names, or there is a better way to do this?

Upvotes: 0

Views: 423

Answers (1)

user8682794
user8682794

Reputation:

Consider the following toy example:

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 |
     +-----------------------------------------------------------+

You could simply use wildcard characters:

mkmat d*, matrix(d)

or

mkmat d?, matrix(d)

Alternatively, the commands ds and unab can be used to create a local macro containing a list of qualifying variable names, which can then be used in 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

The advantage of ds is that it can be used to further filter results with its has() or not() options.

For example, if some of your variables are strings, mkmat will complain:

tostring d3 d5, force replace
mkmat d*, matrix(d)
string variables not allowed in varlist;
d3 is a string variable

However, the following will work fine:

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

Type help ds or help unab from Stata's command prompt for full syntax details.

Upvotes: 1

Related Questions