楼主: stataxp
1337 6

[编程问题求助] 求最接近的競爭者 [推广有奖]

  • 0关注
  • 0粉丝

大专生

91%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
25.1481
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
-355 点
帖子
45
精华
0
在线时间
92 小时
注册时间
2008-10-26
最后登录
2018-11-28

楼主
stataxp 发表于 2017-2-15 00:21:36 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
请问我有二笔资料,母文件和子档。我想以子文件为索引,在母文件中找寻sale成绩与最近的对手,

最接近的对手定义= min abs(psale-ssale)但不能为本身。

之前在sas做是用sql的left join加where去做,但stata好像沒有完整的sql。

感觉好像要在子档写loop,以子档的条件下,找寻销售额差异最小,并返回

对应的公司…

感谢大家。

数据链路:http://pan.baidu.com/s/1nuAJyad


资料:
母檔=
com     year    group   psale
apple   1998    1       8
lg      1998    1       42
acer    1998    1       9
asus    1998    1       25
hp      1998    1       57
samsung 1998    1       13
htc     1998    1       94
ms      1998    1       2
lemax   1998    2       20
.
.

子檔=
com     year    group   ssale   closeone
lg      1998    1       42      hp
samsung 1998    1       13
vivo    1998    2       37
二维码

扫码加我 拉你入群

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

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

关键词:left join Samsung Group Stata Apple 销售额 where 资料

沙发
黃河泉 在职认证  发表于 2017-2-16 08:12:02
你给的资讯似乎还不够完整!
  • 除了 1998 年外,还有其它年吗?若有的话,竞争对手应该还是同一年去寻找的吧?
  • 子母档不是同一个档吧(有何关系?子档是母档的部分集合吗?)?其中,为何 lg and samsung 的 psale 与 ssale 都一样?
  • 就母档你所给资料(9家)与子档(3 家)请完成 closeone 之你想之结果(才能确定你的目的)!
  • 如若我可以直接单就针对母档求出每一公司之 closeone,是不是就可以回答你的问题?(若是的话,写程序会较方便)

藤椅
stataxp 发表于 2017-2-16 15:35:11
1=竞争对手应该在同年同群组里找(其中群组已事先依其它财务指标分类)
2=子文件是母文件部分集合。
3=是的,这只是个模拟档案,实际上母档是几十万笔,子档是一万多笔。
4=是的,若能在母檔中就每家公司[同群及同年条件下]找到与他sale最相近者也是答案。

SAS sql的程序大概是:
create table new as select*,  abs(子.sale-母.sale) as matchsale
from 子lef join 母
on 子.date=母.date  and 子.group=母.group and abs(子.sale-母.sale)^=0

板凳
黃河泉 在职认证  发表于 2017-2-16 16:52:44
stataxp 发表于 2017-2-16 15:35
1=竞争对手应该在同年同群组里找(其中群组已事先依其它财务指标分类)
2=子文件是母文件部分集合。
3=是的 ...
1. 请点回复我才能接获通知!2. 同一群也请告知(什么变量,例如产业),最好举个例子,才能一鼓作气回答(这涉及到 coding)。3. 我心目中有初步想法与作法,但可能将其 post 到美国 Stata 论坛去寻求更好之答案!

报纸
stataxp 发表于 2017-2-16 18:15:11
黃河泉 发表于 2017-2-16 16:52
1. 请点回复我才能接获通知!2. 同一群也请告知(什么变量,例如产业),最好举个例子,才能一鼓作气回答 ...
變數有TIME(時間),股價淨值比, 公司代碼 組別(依市值區分)。資料大約像這樣:對每一筆資料中的公司代碼,依其組別及時間的條件下,找尋股價淨值比最相近的公司代碼,但不能為本身。

時間             公司代碼        組別        股價淨值比        最近的對手
1988m1        tw1701        1        2.45                 tw1410
1988m1        tw1213        1        1.98                  tw1701
1988m1        tw1707        1        2.67       
1988m1        tw2702        1        9.45       
1988m1        tw9902        1        4.16       
1988m1        tw1410        1        2.57       
1988m2        tw2601        3        27.44       
1988m2        tw2505        3        9.49       
1988m2        tw1413        3        1.46       
1988m2        tw2901        3        3.74       
1988m2        tw1417        4        1.87       
1988m2        tw1506        4        3.24       
1988m2        tw1215        4        3.58       

地板
stataxp 发表于 2017-2-17 17:24:01
stataxp 发表于 2017-2-16 18:15
變數有TIME(時間),股價淨值比, 公司代碼 組別(依市值區分)。資料大約像這樣:對每一筆資料中的公司代碼, ...
謝謝黃老師,我後來東想西問,找到一些提示便解決了。
大概的方法就是在母檔裡排序[bysort group time (sale)],依上下位相減。若下位大,則取公司代碼的上一位,若上位大,則取公司代碼的下一位。用cond指令分配,不用loop很快就解決了。感謝。

7
黃河泉 在职认证  发表于 2017-2-17 17:39:43
stataxp 发表于 2017-2-17 17:24
謝謝黃老師,我後來東想西問,找到一些提示便解決了。
大概的方法就是在母檔裡排序,依上下位相減。若下 ...
也可试试 (Clyde Schechter 所提供)
  1. * Example generated by -dataex-. To install: ssc install dataex
  2. clear
  3. input str8(time id) float(group pratio)
  4. "1988m1" "tw1701" 1  2.45
  5. "1988m1" "tw1213" 1  1.98
  6. "1988m1" "tw1707" 1  2.67
  7. "1988m1" "tw2702" 1  9.45
  8. "1988m1" "tw9902" 1  4.16
  9. "1988m1" "tw1410" 1  2.57
  10. "1988m2" "tw2601" 3 27.44
  11. "1988m2" "tw2505" 3  9.49
  12. "1988m2" "tw1413" 3  1.46
  13. "1988m2" "tw2901" 3  3.74
  14. "1988m2" "tw1417" 4  1.87
  15. "1988m2" "tw1506" 4  3.24
  16. "1988m2" "tw1215" 4  3.58
  17. end

  18. preserve
  19. keep id group pratio
  20. rename pratio pratio_j
  21. rename id id_j
  22. tempfile holding
  23. save `holding'
  24. restore

  25. rename pratio pratio_i
  26. rename id  id_i

  27. joinby group using `holding'

  28. gen delta = abs(pratio_i-pratio_j)
  29. drop if id_i == id_j
  30. by id_i (delta), sort: keep if _n == 1
  31. sort group id_i
复制代码
但資料大時可能 memory 會有問題!

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

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2026-2-1 18:44