Eric Cahuzac
> Does anyone know how to solve this pb
> Here is my data set (a sample)
>
> +----------------+
> | v1 v2 v3 |
> |----------------|
> 1. | 2 100 101 |
> 2. | 2 100 102 |
> 3. | 2 100 104 |
> 4. | 3 100 105 |
> 5. | 2 100 106 |
> |----------------|
> 6. | 3 100 125 |
> 7. | 2 100 131 |
> 8. | 2 100 138 |
> 9. | 2 101 105 |
> 10. | 2 101 106 |
> |----------------|
> 11. | 3 101 125 |
> 12. | 2 101 131 |
> 13. | 2 102 104 |
> 14. | 2 102 105 |
> 15. | 2 102 106 |
> +----------------+
>
> a table of v2 v3, missing gives that
>
> ----------------------------------------------------------
> | v3
> v2 | 101 102 104 105 106 125 131 138
> ----------+-----------------------------------------------
> 100 | 1 1 1 1 1 1 1 1
> 101 | . . . 1 1 1 1 .
> 102 | . . 1 1 1 . . .
> ----------------------------------------------------------
>
> I want to obtain a matrix:
>
> A[3,8]
> 101 102 104 105 106 125 131 138
> 100 . . . . . . . .
> 101 . . . . . . . .
> 102 . . . . . . . .
>
> where dots are replaced by corresponding values of v1
>
> I try something like the following:
>
> vallist v2, g(v2)
> qui tab v2
> global nbli=r(r)
> vallist v3, g(v3)
> qui tab v3
> global nbco=r(r)
>
> matrix A=J($nbli,$nbco,.)
> mat rown A = $v2
> mat coln A = $v3
>
> local i = 0
> local j = 0
> foreach k of num $v2 {
> local i = `i' + 1
> foreach m of num $v3 {
> local j = `j' + 1
> matrix A[`i',`j']=????????
> }
> local j = 0
> }
>
> Do you have any idea on how to cope with this problem?
In your example, each row and column combination occurs
at most once. I'm going to assume that is generic.
(1) Canned solution using -tabcount- from SSC
=============================================
. ssc inst tabcount
. levels v2 , local(l2)
. levels v3 , local(l3)
. tabcount v2 v3 [w=v1] , v1(`l2') v2(`l3') matrix(mymatrix)
(frequency weights assumed)
----------------------------------------------------
| v3
v2 | 102 104 105 106 125 131 138
----------+-----------------------------------------
100 | 2 2 3 2 3 2 2
101 | 2 2 3 2
102 | 2 2 2
----------------------------------------------------
. mat li mymatrix
mymatrix[3,7]
102 104 105 106 125 131 138
100 2 2 3 2 3 2 2
101 0 0 2 2 3 2 0
102 0 2 2 2 0 0 0
(You have to fix 0 to missing...)
(2) Your code, modified a bit
=============================
vallist v2, g(v2)
qui tab v2
global nbli=r(r)
vallist v3, g(v3)
qui tab v3
global nbco=r(r)
matrix A=J($nbli,$nbco,.)
mat rown A = $v2
mat coln A = $v3
local i = 0
foreach k of num $v2 {
local i = `i' + 1
local j = 0
foreach m of num $v3 {
local j = `j' + 1
local v2 : word `i' of $v2
local v3 : word `j' of $v3
su v1 if v2 == `v2' & v3 == `v3', meanonly
matrix A[`i',`j'] = r(min)
}
}
(3) Your code, modified more, official Stata 8 only
===================================================
levels v2, local(l2)
levels v3, local(l3)
matrix A = J(`: word count `l2'',`: word count `l3'',.)
mat rown A = `l2'
mat coln A = `l3'
local i = 1
foreach k of local l2 {
local j = 1
foreach m of local l3 {
su v1 if v2 == `k' & v3 == `m', meanonly
matrix A[`i++',`j++'] = r(min)
}
}
Nick
[email protected]
*
* For searches and help try:
* http://www.stata.com/support/faqs/res/findit.html
* http://www.stata.com/support/statalist/faq
* http://www.ats.ucla.edu/stat/stata/