全部版块 我的主页
论坛 计量经济学与统计论坛 五区 计量经济学与统计软件 Stata专版
1451 5
2011-11-24
我有如下的数据库:
     X1   X2     PRO       PRO2
     1      2       0.3
     1      3       0.25
     2      1       0.61
     2      3       0.51
     ..........
   我要做的是,检查当X1、X2的取值刚好互换位置时,把对应的PRO值取到PRO2中,且删除掉互换位置的这条样本。即将上面的数据中的第三条记录的PRO值0.61放到第一条记录的PRO2中,且删除掉第三条记录,变成:
     X1   X2     PRO       PRO2
     1      2       0.3        0.61
     1      3       0.25
     2      3       0.51
     ..........
    我的总记录数一共有1440条,其中有几百条记录存在这种X1、X2互换位置的情况,只互换一次。
    想不出用什么代码写,请大家帮帮忙。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2011-11-24 17:11:46
**********************************
clear
input   x1   x2     pro   
     1      2       0.3
     1      3       0.25
     2      1       0.61
     2      3       0.51
end

gen id1=x1*10+x2
gen id2=x2*10+x1
list

gen  id=id1
sort id
save d:\temp1.dta,replace
**********************************
drop id
gen id=id2
rename pro pro2
sort id
drop id1 id2 x1 x2
save d:\temp2.dta,replace
**********************************

use d:\temp1.dta,clear
drop id1 id2
merge 1:1 id using d:\temp2.dta

drop if _merge==2

bysort _merge: gen id0=_n
drop if id0>=2 & _merge==3

order x1 x2 id pro pro2
drop  _merge id0
**********************************
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2011-11-24 17:12:38
. **********************************
. clear

. input   x1   x2     pro   

            x1         x2        pro
  1.      1      2       0.3
  2.      1      3       0.25
  3.      2      1       0.61
  4.      2      3       0.51
  5. end

.
. gen id1=x1*10+x2

. gen id2=x2*10+x1

. list

     +---------------------------+
     | x1   x2   pro   id1   id2 |
     |---------------------------|
  1. |  1    2    .3    12    21 |
  2. |  1    3   .25    13    31 |
  3. |  2    1   .61    21    12 |
  4. |  2    3   .51    23    32 |
     +---------------------------+

.
. gen  id=id1

. sort id

. save d:\temp1.dta,replace
file d:\temp1.dta saved

. **********************************
. drop id

. gen id=id2

. rename pro pro2

. sort id

. drop id1 id2 x1 x2

. save d:\temp2.dta,replace
file d:\temp2.dta saved

. **********************************
.
. use d:\temp1.dta,clear

. drop id1 id2

. merge 1:1 id using d:\temp2.dta

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

    matched                                 2  (_merge==3)
    -----------------------------------------

.
. drop if _merge==2
(2 observations deleted)

.
. bysort _merge: gen id0=_n

. drop if id0>=2 & _merge==3
(1 observation deleted)

.
. order x1 x2 id pro pro2

. drop  _merge id0

. **********************************
. list

     +---------------------------+
     | x1   x2   id   pro   pro2 |
     |---------------------------|
  1. |  1    3   13   .25      . |
  2. |  2    3   23   .51      . |
  3. |  1    2   12    .3    .61 |
     +---------------------------+

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2011-11-24 19:16:24
谢谢版主提供的思路,太让我感动了!
我已经根据你的代码,做了些小的修改搞定了。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2011-11-25 09:51:05
我的总记录数一共有1440条,其中有几百条记录存在这种X1、X2互换位置的情况,只互换一次。
tempfile f1 f2
save `f1',replace
rename (x1 x2 pro pro2)(x2 x1 pro2 pro )
save `f2',replace
use `f1',clear
merg 1:1 x1 x2 using `f2', update
keep if (_merg==4& x1<x2)|_merg==1
drop _merg
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2011-11-25 10:09:26
tempfile f1
save `f1',replace
rename (x1 x2 pro pro2)(x2 x1 pro2 pro )
append using `f1'
collapse (min) pro pro2 if x1<x2,by(x1 x2)
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群