Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: st: converting table into matrix
From
Nick Cox <[email protected]>
To
"[email protected]" <[email protected]>
Subject
Re: st: converting table into matrix
Date
Sat, 29 Mar 2014 09:39:24 +0000
This can be corrected and simplified as follows, illustrating the 7th
Law of Stata programming, that a shorter program needs more time. I
don't repeat Rochelle's code setting up a data example.
qui tab C_industry
local nvals = r(r)
egen i = seq(), block(`nvals')
egen j = seq(), to(`nvals')
matrix A=J(`nvals',`nvals',.)
forval n = 1/`=_N' {
matrix A[`=i[`n']', `=j[`n']'] = x[`n']
if C_industry[`n'] != C_industry[`=`n'-1'] {
local rownames `rownames' `=C_industry[`n']'
}
}
matrix rownames A = `rownames'
matrix colnames A = `rownames'
matrix list A
Nick
[email protected]
On 29 March 2014 01:36, Nick Cox <[email protected]> wrote:
> Your main error is to overlook the fact that -encode- by default
> encodes in alphanumeric order. See for example the thread started by
> Michael McCulloch recently at
> http://www.stata.com/statalist/archive/2014-03/msg00346.html which
> underlined this point.
>
> There are various ways round this. One is just not to -encode-. If you
> map your string values to value labels, you then have to read them
> back.
>
> This code goes further than yours in supplying row and column names
> for the matrix. The assumption is that the string variables contain
> values all suitable as matrix row and column labels.
>
> clear all
> input str20 C_industry str20 S_industry int x
> Forestrysupport Forestrysupport 0
> Forestrysupport Forestrynursery 0
> Forestrysupport logging 0
> Forestrynursery Forestrysupport 64
> Forestrynursery Forestrynursery 1
> Forestrynursery logging 1
> logging Forestrysupport 7
> logging Forestrynursery 29
> logging logging 41
> end
>
> qui tab C_industry
> local nvals = r(r)
>
> egen i = seq(), block(`nvals')
> egen j = seq(), to(`nvals')
>
> matrix A=J(`nvals',`nvals',.)
> matrix list A
>
> forval n = 1/`=_N' {
> matrix A[`=i[`n']', `=j[`n']'] = x[`n']
> if C_industry[`n'] != C_industry[`=`n'-1'] {
> local rownames `rownames' `=C_industry[`n']'
> }
> if `n' < `nvals' {
> local colnames `colnames' `=S_industry[`n']'
> }
> }
> matrix rownames A = `rownames'
> matrix colnames A = `colnames'
> matrix list A
>
> Nick
> [email protected]
>
>
> On 28 March 2014 23:05, R Zhang <[email protected]> wrote:
>> Nick,
>> I forgot to post the code. Sorry! My real data has over 400*400
>> dimensions in a stata data format. that is why i can't use simple
>> matrix command to input data as matrix.
>>
>>
>> ***** my hypothetical data
>> clear all
>> input str20 C_industry str20 S_industry int x
>> Forestrysupport Forestrysupport 0
>> Forestrysupport Forestrynursery 0
>> Forestrysupport logging 0
>> Forestrynursery Forestrysupport 64
>> Forestrynursery Forestrynursery 1
>> Forestrynursery logging 1
>> logging Forestrysupport 7
>> logging Forestrynursery 29
>> logging logging 41
>> end
>>
>> list
>>
>> encode C_industry, gen(c)
>> encode S_industry, gen(s)
>>
>>
>>
>> drop C_ S_
>> list
>>
>> levelsof c, local(levs)
>> local rows : word count `levs'
>> matrix A=J(`rows',`rows',.)
>> matrix list A
>>
>> forval i=1/`=_N' {
>> local r=c[`i']
>> local c=s[`i']
>> matrix A[`r',`c']=x[`i']
>> }
>>
>> matrix list A
>>
>> *******************************************
>>
>> my guess is that the best approach is to use a loop to input data into matrix.
>>
>> my original post indicates the code did not produce the matrix I
>> wanted. could you please critique?
>>
>> thanks a lot,
>>
>> Rochelle
>>
>>
>> On Fri, Mar 28, 2014 at 3:49 PM, Nick Cox <[email protected]> wrote:
>>> I don't see that your code produces a matrix at all.
>>>
>>> Seems that you would be better off just typing it in directly.
>>>
>>> matrix want = (0,0,0\64,1,1\7,29,41)
>>> matrix rownames want = Forestrysupport Forestrynursery logging
>>> matrix colnames want = Forestrysupport Forestrynursery logging
>>>
>>> Nick
>>> [email protected]
>>>
>>>
>>> On 28 March 2014 19:37, R Zhang <[email protected]> wrote:
>>>> Dear all,
>>>>
>>>> I have the following sample code to input data from stata (see below
>>>> datahave) and get an output in matrix form. after that i will compute
>>>> eigenvalue for this matrix.
>>>>
>>>> the code runs, but the output matrix has some elements misplaced. I
>>>> wonder if someone could help correct it.
>>>>
>>>> thanks!
>>>> ++++++++++++
>>>> datahave
>>>> clear all
>>>> input str20 C_industry str20 S_industry int x
>>>> Forestrysupport Forestrysupport 0
>>>> Forestrysupport Forestrynursery 0
>>>> Forestrysupport logging 0
>>>> Forestrynursery Forestrysupport 64
>>>> Forestrynursery Forestrynursery 1
>>>> Forestrynursery logging 1
>>>> logging Forestrysupport 7
>>>> logging Forestrynursery 29
>>>> logging logging 41
>>>> end
>>>> ++++++++++++
>>>>
>>>> ++++++++++++
>>>> matrix want
>>>> c1 c2 c3
>>>> r1 0 0 0
>>>> r2 64 1 1
>>>> r3 7 29 41
>>>>
>>>>
>>>> I would like to replace c1,c2,c3 with variable names Forestrysupport
>>>> Forestrynursery logging
>>>>
>>>> -Rochelle
>>>> *
>>>> * For searches and help try:
>>>> * http://www.stata.com/help.cgi?search
>>>> * http://www.stata.com/support/faqs/resources/statalist-faq/
>>>> * http://www.ats.ucla.edu/stat/stata/
>>> *
>>> * For searches and help try:
>>> * http://www.stata.com/help.cgi?search
>>> * http://www.stata.com/support/faqs/resources/statalist-faq/
>>> * http://www.ats.ucla.edu/stat/stata/
>> *
>> * For searches and help try:
>> * http://www.stata.com/help.cgi?search
>> * http://www.stata.com/support/faqs/resources/statalist-faq/
>> * http://www.ats.ucla.edu/stat/stata/
*
* For searches and help try:
* http://www.stata.com/help.cgi?search
* http://www.stata.com/support/faqs/resources/statalist-faq/
* http://www.ats.ucla.edu/stat/stata/