全部版块 我的主页
论坛 计量经济学与统计论坛 五区 计量经济学与统计软件 Stata专版
2786 12
2009-02-28
刚接触stata不久,请大家帮忙指导一下如下实现下面的功能,谢谢!
已知在下表所有ID相同的行中,X取值都不同。求在ID相同时,对于每个不同的Y值(不含缺省),|X-Y|的最小值。X不一定与Y同行。
比如下面表格中,Y=2时,最小值就是32,Y=58时,最小值是11,Y=7时,最小值是22..。 以此类推

因为数据较多,所以不知道是不是需要用循环实现?
ID
1
X
34
Y
2
1 90            -
1 47 58
3 29 7
3  32
           -
9 83 8
9 93 34
12 32 9

[此贴子已经被作者于2009-3-1 11:55:30编辑过]

二维码

扫码加我 拉你入群

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

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

全部回复
2009-3-1 11:10:00
bysort id: g n=_n
sort n id
g p=_n
sort id p
by id: egen q=min(p)
sum id if n==1
local m=r(N)
g min=0
forv i=1(1)`m'{
mkmat x if q==`i',mat(x)
mkmat y if q==`i',mat(y)
local s=.
local r=rowsof(x)
forv j=1(1)`r'{
forv k=1(1)`r'{
mat def u=el(x,`j',1)-el(y,`k',1)
local t=abs(det(u))
if `t'<`s' local s=`t'
}
}
replace min=`s' if q==`i'
mat drop x y
}
keep id x y min
eblog  金币 +10  金钱 +100  魅力 +10  经验 +50  奖励 2009-3-1 13:30:23
二维码

扫码加我 拉你入群

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

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

2009-3-1 11:54:00
谢谢版主!我运行了一下还有点小问题,这样编出来,在同ID下,不同的Y值得出的最小值一样了,就是说Y=2和Y=58都得出了11。
不知道是什么地方还需要改进下啊?还请版主帮忙看看:)
二维码

扫码加我 拉你入群

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

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

2009-3-1 12:42:00

你想要什么样的最终结果?

二维码

扫码加我 拉你入群

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

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

2009-3-1 14:19:00
不好意思,可能是我没说清楚~~
我希望最后得到的是:
Min
32    (=|34-2|)
-
11    (=|47-58|)
22    (=|29-7|)
-
75    (=|83-8|)
49    (=|83-34|)
23    (=|32-9|)

谢谢:)

二维码

扫码加我 拉你入群

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

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

2009-3-1 14:22:00

bysort id: g n=_n
sort n id
g p=_n
sort id p
by id: egen q=min(p)
sum id if n==1
local m=r(N)
g min=0
forv i=1(1)`m'{
mkmat x if q==`i',mat(a)
mkmat y if q==`i',mat(b)
local s=.
local r=rowsof(a)
forv j=1(1)`r'{
forv k=1(1)`r'{
local t=abs(el(b,`j',1)-el(a,`k',1))
if `t'<`s' local s=`t'
}
replace min=`s' if q==`i'&y==el(b,`j',1)
}
}
replace min=. if y==.
keep id x y min

*这样可以更简洁一些(生成矩阵时不要使用数据库的变量名)

[此贴子已经被作者于2009-3-2 12:00:21编辑过]

二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
栏目导航
热门文章
推荐文章

说点什么

分享

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