楼主: jzhyue
5355 14

求助:对数值进行指定范围分组 [推广有奖]

  • 2关注
  • 3粉丝

已卖:7份资源

副教授

35%

还不是VIP/贵宾

-

威望
0
论坛币
398 个
通用积分
477.5302
学术水平
60 点
热心指数
59 点
信用等级
48 点
经验
10958 点
帖子
454
精华
0
在线时间
1118 小时
注册时间
2005-12-31
最后登录
2025-12-9

楼主
jzhyue 发表于 2009-11-21 20:14:52 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
各位老师:有一个数据库data1,其中有一个变量id,另外一个数据库data2,包含三个变量;group,begin,end.如下表,现想对data1用data2指定的分组办法分组(begin & end指data1中id的范围,group为组别),,请各位老师帮助!
data1data2
idgroupbegin
end
1113
2246
3378
44910
551118
661928
772930
883152
995355
10
11
12
13
14
15
16
17
18
19
20
二维码

扫码加我 拉你入群

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

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

关键词:begin Group Data beg End 求助 分组 范围 数值

回帖推荐

sungmoo 发表于8楼  查看完整内容

如果,data1中id均在data2中出现(data2中begin最小值与end最大值之间的值未必属于在data1中id的值)5楼与6楼是等价的,你可以试一下。

sungmoo 发表于6楼  查看完整内容

*以下更一般(data1中id在data2中begin最小值与end最大值之间),并涵盖了2楼。 use data2,clear expandcl end-begin+1,cl(group) gen(id) bys group: replace id=begin[1]+_n-1 keep group id append using data1 bys id: g g=_N drop if g

sungmoo 发表于5楼  查看完整内容

*data1中id在data2中begin最小值与end最大值之间,且data1中id在data2中均出现过。 use data1,clear keep id bys id: keep if _n1&group

sungmoo 发表于2楼  查看完整内容

*设data2中end的最大值即data1中id的最大值,且data1中每个id可以有多个观测值 use data2,clear expandcl end-begin+1,cl(group) gen(id) keep group id save data,replace use data1,clear joinby id using data

本帖被以下文库推荐

沙发
sungmoo 发表于 2009-11-22 16:50:55
*设data2中end的最大值即data1中id的最大值,且data1中每个id可以有多个观测值
use data2,clear
expandcl end-begin+1,cl(group) gen(id)
keep group id
save data,replace
use data1,clear
joinby id using data
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
crystal8832 + 50 + 2 + 2 + 2 精彩帖子

总评分: 论坛币 + 50  学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

藤椅
jzhyue 发表于 2009-11-22 21:19:09
谢谢sungmoo老师:
您的这种思路很巧妙!将分组巧妙的转化,非常感谢!

板凳
jzhyue 发表于 2009-12-5 19:26:15
经调试,有一个问题不好解决:如果data1中的数据id有不连续的,比如10直接到15,则sungmoo老师的语句会出现错误,由expandcl end-begin+1,cl(group) gen(id)产生的是一个连续的id。与data1中的id没有对应。
请路过的老师帮助解决一下!
(我暂时用的方法是将data1拆分成几个文件产,然后再用sungmoo老师的方法)

报纸
sungmoo 发表于 2009-12-5 21:52:11
*data1中id在data2中begin最小值与end最大值之间,且data1中id在data2中均出现过。
use data1,clear
keep id
bys id: keep if _n<2
save data,replace
use data2,clear
expandcl end-begin+1,cl(group) gen(id)
keep group id
append using data
bys id: g g=_N
keep if g>1&group<.
drop g
save data,replace
use data1,clear
joinby id using data

地板
sungmoo 发表于 2009-12-6 09:34:54
*以下更一般(data1中id在data2中begin最小值与end最大值之间),并涵盖了2楼。
use data2,clear
expandcl end-begin+1,cl(group) gen(id)
bys group: replace id=begin[1]+_n-1
keep group id
append using data1
bys id: g g=_N
drop if g<2&group<.
bys id: egen mn=min(group) if g>1
drop if group<.&g>1
drop g group
ren mn group

7
jzhyue 发表于 2009-12-6 21:58:43
jzhyue 发表于 2009-12-5 19:26
经调试,有一个问题不好解决:如果data1中的数据id有不连续的,比如10直接到15,则sungmoo老师的语句会出现错误,由expandcl end-begin+1,cl(group) gen(id)产生的是一个连续的id。与data1中的id没有对应。
sungmoo  老师:可能我的问题没有表述清楚,data1中缺失的id,不参与data2中的分组,不在任何一个begin与end之间,(即在data2中没有data1中缺失的id,缺失的id在组与组之间,即,第n组的end与第n+1组的begin相差的大于1,相差的号码就是缺失的id.)这样的话expandcl end-begin+1,cl(group) gen(id)产生的id中间有部分就多出来。data1中的id最大值等于data2最大的一个end值。
谢谢sungmoo老师!

8
sungmoo 发表于 2009-12-6 22:04:10
jzhyue 发表于 2009-12-6 21:58 可能我的问题没有表述清楚,data1中缺失的id,不参与data2中的分组,不在任何一个begin与end之间,(即在data2中没有data1中缺失的id,缺失的id在组与组之间,即,第n组的end与第n+1组的begin相差的大于1,相差的号码就是缺失的id.)这样的话expandcl产生的id中间有部分就多出来。data1中的id最大值等于data2最大的一个end值。
如果,data1中id均在data2中出现(data2中begin最小值与end最大值之间的值未必属于在data1中id的值)5楼与6楼是等价的,你可以试一下。

9
jzhyue 发表于 2009-12-7 11:10:43
问题解决,需要增加一下代码
sungmoo 发表于 2009-12-6 09:34
*以下更一般更简洁(data1中id在data2中begin最小值与end最大值之间),并涵盖了2楼。
use data2,clear
sort group
gen begin1=end[_n-1]+1
replace begin1=begin in _n==1
expandcl end-begin1+1,cl(group) gen(id)
keep group id
append using data1
bys id: g g=_N
keep if g>1
bys id: egen m=min(group)
drop if group<.
drop g group
ren m group
谢谢sungmoo老师

10
sungmoo 发表于 2009-12-7 17:03:04
jzhyue 发表于 2009-12-7 11:10 问题解决,需要增加一下代码
可否把你的data2贴出来?

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

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