楼主: douban
5144 17

请问如何将长方矩阵变为方阵?谢谢。 [推广有奖]

11
fgleric 发表于 2012-11-21 05:47:56
蓝色 发表于 2012-11-21 03:36
clear
input   ///
str12 id             str12  x
没有最简,只有更简~~

12
sungmoo 发表于 2012-11-21 08:35:15
个人理解,这里的关键(难点)是,楼主所要的“方阵”。

设想数据是:
v1   v2
A    G
B    F
C    E
A    H

则按楼主的意思,生成的方阵是否是7阶方阵?(v1与v2的观测值共有7种字符)
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
h3327156 + 5 + 5 + 5 好问题

总评分: 学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

13
蓝色 发表于 2012-11-21 14:48:40
***************************************
clear
input   ///
str12 id1             str12  id2
A                      G
B                      F
C                      E
A                      H
end

******************************************
gen n=1
sort id1 id2
saveold d:\temp\temp02.dta,replace

**********************************
replace  n=_n
reshape long id,i(n) j(t)
collapse n,by(id)
drop n

rename id id2
saveold     d:\temp\temp01.dta,replace
rename id id1
cross using d:\temp\temp01.dta
sort id1 id2
saveold d:\temp\temp01.dta,replace

***************************************************

merge 1:1 id1 id2 using d:\temp\temp02.dta
mvencode _all, mv(0)
drop  _merge

**************************************************
reshape wide @n,i(id1) j(id2) str
rename *n *
list
**************************************************
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
h3327156 + 5 + 5 + 5 两位版主精彩对答

总评分: 学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

14
蓝色 发表于 2012-11-21 14:49:35
. ***************************************
. clear

. input   ///
> str12 id1             str12  id2

              id1           id2
  1. A                      G
  2. B                      F
  3. C                      E
  4. A                      H
  5. end

.
. ******************************************
. gen n=1

. sort id1 id2

. saveold d:\temp\temp02.dta,replace
file d:\temp\temp02.dta saved

.
. **********************************
. replace  n=_n
(3 real changes made)

. reshape long id,i(n) j(t)
(note: j = 1 2)

Data                               wide   ->   long
-----------------------------------------------------------------------------
Number of obs.                        4   ->       8
Number of variables                   3   ->       3
j variable (2 values)                     ->   t
xij variables:
                                id1 id2   ->   id
-----------------------------------------------------------------------------

. collapse n,by(id)

. drop n

.
. rename id id2

. saveold     d:\temp\temp01.dta,replace
file d:\temp\temp01.dta saved

. rename id id1

. cross using d:\temp\temp01.dta

. sort id1 id2

. saveold d:\temp\temp01.dta,replace
file d:\temp\temp01.dta saved

.
. ***************************************************
. merge 1:1 id1 id2 using d:\temp\temp02.dta

    Result                           # of obs.
    -----------------------------------------
    not matched                            45
        from master                        45  (_merge==1)
        from using                          0  (_merge==2)

    matched                                 4  (_merge==3)
    -----------------------------------------

. mvencode _all, mv(0)
         id1: string variable ignored
         id2: string variable ignored
           n: 45 missing values recoded

. drop  _merge

.
. **************************************************
. reshape wide @n,i(id1) j(id2) str
(note: j = A B C E F G H)

Data                               long   ->   wide
-----------------------------------------------------------------------------
Number of obs.                       49   ->       7
Number of variables                   3   ->       8
j variable (7 values)               id2   ->   (dropped)
xij variables:
                                      n   ->   An Bn ... Hn
-----------------------------------------------------------------------------

. rename *n *

. list

     +---------------------------------+
     | id1   A   B   C   E   F   G   H |
     |---------------------------------|
  1. |   A   0   0   0   0   0   1   1 |
  2. |   B   0   0   0   0   1   0   0 |
  3. |   C   0   0   0   1   0   0   0 |
  4. |   E   0   0   0   0   0   0   0 |
  5. |   F   0   0   0   0   0   0   0 |
  6. |   G   0   0   0   0   0   0   0 |
  7. |   H   0   0   0   0   0   0   0 |
     +---------------------------------+


. **************************************************

15
douban 发表于 2012-11-21 15:13:10
sungmoo 发表于 2012-11-21 08:35
个人理解,这里的关键(难点)是,楼主所要的“方阵”。

设想数据是:
是的,是7阶方阵。
大家回帖好热情。
感谢。

16
douban 发表于 2012-11-21 18:32:46
大白菜2012 发表于 2012-11-21 01:29
clear

input y    x
谢谢大家。
已经使用大白菜的方法解决了。
再次感谢大白菜。
哈哈。

17
sungmoo 发表于 2012-11-22 00:45:20
*设两个变量是v1与v2,且观测值不是很多。以下可以适用于v1与v2的观测值为“含空格字符串”的情形,并且生成矩阵m:

clear all
inp str10 v1 str10 v2
"a b c" "a"
"d e f" "b"
"g h i" "c"
"a" "a b c"
"b" "d e f"
"c" "g h i"
"d" "e"
end


preserve
g i=_n
reshape long v,i(i) j(j)
collapse (count)i, by(v)
mat m=J(_N,_N,0)
levelsof v,l(v)
mat rown m=`v'
mat coln m=`v'
restore
forv i=1/`=_N'{
mat m[rownumb(m, v1[`i']),colnumb(m, v2[`i'])]=1
}
n mat l m

18
douban 发表于 2012-11-22 15:10:06
sungmoo 发表于 2012-11-22 00:45
*设两个变量是v1与v2,且观测值不是很多。以下可以适用于v1与v2的观测值为“含空格字符串”的情形,并且生成 ...
3x~
已经解决!

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2025-12-25 15:19