楼主: love27
2467 11

[数据管理求助] 求助如何生成一个变量为1当另一变量前后两年不同时 [推广有奖]

  • 1关注
  • 0粉丝

已卖:1份资源

大专生

75%

还不是VIP/贵宾

-

威望
0
论坛币
486 个
通用积分
0.9000
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
504 点
帖子
50
精华
0
在线时间
71 小时
注册时间
2015-12-1
最后登录
2022-4-10

楼主
love27 发表于 2020-8-9 18:23:55 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
复制代码
  1. * Example generated by -dataex-. To install: ssc install dataex
  2. clear
  3. input str1 firm int year str1 stuff
  4. "a" 2017 "x"
  5. "a" 2018 "y"
  6. "a" 2017 "x"
  7. "a" 2017 "x"
  8. "a" 2018 "y"
  9. "b" 2018 "m"
  10. "b" 2017 "m"
  11. "b" 2017 "m"
  12. "b" 2018 "m"
  13. end
复制代码




a公司2018的stuff为y,与2017的x不同,这时想生成一个newvar=1;
b公司2018的stuff没有改变,newvar=0.
如图所示
QQ图片20200809182215.png
这时应该如何编写代码呢?求各位大佬帮忙
之前的数据和截图错了,重新改了一下。
二维码

扫码加我 拉你入群

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

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

关键词:generated generate install example stuff

QQ图片20200809182215.png (18.89 KB)

QQ图片20200809182215.png

沙发
2537542054 学生认证  发表于 2020-8-9 19:57:46
提供个思路,仅供参考{:2_27:}
  1. bysort year stuff : egen numstuff=count(firm)
  2. sort firm year
  3. by firm year: egen numyear=count(year)
  4. gen newvar1=0 if numstuff==numyear
  5. replace newvar1=0 if newvar1==.
  6. gen newvar2=1 if numstuff!=numyear
  7. replace newvar2=0 if newvar2==.
  8. gen newvar=newvar1+newvar2
  9. drop numyear numstuff
  10. drop newvar1 newvar2
复制代码

藤椅
2537542054 学生认证  发表于 2020-8-9 19:59:13
新手尝试

板凳
love27 发表于 2020-8-9 22:16:02
求高手帮忙qaq

报纸
DΘstinyじò 发表于 2020-8-10 14:19:47
假若你只考虑2018年的情况,而且同一公司同一年份的stuff值相同,那么可以试一下下面代码:
  1. bys firm: gen firm_in_id=_n
  2. bys firm (year) : gen newvar=stuff[_n]!= stuff[_n-1] if year==2018
  3. bys firm  year  : replace newvar=newvar[1] if year==2018
  4. sort firm firm_in_id
  5. drop firm_in_id
复制代码
如若不是,那需要在dataex贴出示例数据的时候,提供的是代表数据结构特征性的数据。

地板
DΘstinyじò 发表于 2020-8-10 14:25:44
2537542054 发表于 2020-8-9 19:59
新手尝试
交流学习~~~
好像您的代码按照给的示例数据运行了之后都是0。
您的代码可以简化为:
  1. bysort year stuff : egen numstuff=count(firm)
  2. bys    firm year  : egen numyear =count(year)
  3. gen newvar = numstuff!=numyear
  4. drop numyear numstuff
复制代码
但是可能算法有一些问题。

7
2537542054 学生认证  发表于 2020-8-10 16:10:45
DΘstinyじò 发表于 2020-8-10 14:25
交流学习~~~
好像您的代码按照给的示例数据运行了之后都是0。
您的代码可以简化为:但是可能算法有一 ...
我又跑了一下,咱俩的结果一样,不过你的更简洁,受教了

8
love27 发表于 2020-8-10 18:51:40
DΘstinyじò 发表于 2020-8-10 14:19
假若你只考虑2018年的情况,而且同一公司同一年份的stuff值相同,那么可以试一下下面代码:如若不是,那需要 ...
试过了,是想要的结果,谢谢您!不过第二三行代码的意思吗,没太看懂。。。

9
DΘstinyじò 发表于 2020-8-10 20:46:40
love27 发表于 2020-8-10 18:51
试过了,是想要的结果,谢谢您!不过第二三行代码的意思吗,没太看懂。。。
因为不知道你的数据的顺序有什么要求,就先设置了辅助排序变量,方便运行之后,回到最初的数据排序。(代码1、4、5)
第2行:将firm、year变量sort,以firm为分组,当year==2018年时候进行判断stuff值的变化。第一个等号就赋值,等号后面的stuff[_n]!= stuff[_n-1] 是一个判断表达式,在if条件范围内,正确赋值1,不正确赋值0。实际判断两类stuff值:一类是2018年的第一个和2017年的最后一个(这个是判断前后是否一致的关键点)、一类是2018年内第2个以后的数据与其前一个(这一部分的都为0,因为2018年的都一样)。
第3行:因为第2行代码在第二类判断时,2018年内判断,第2个以后的赋是0,实际应该以2018年第1个的值为准,因而将firm、year变量sort,以firm、year为分组,当year==2018进行相应替换。
bysort 后面的变量,加上( )的只是排序不以此为分组统计计算。

10
管理世界主编 发表于 2020-8-11 11:46:17
可以粗糙设计一下,对字母进行编码,比如设定x为1,y为5,m为10,然后用merge进行匹配,对两个变量相减,如果差值为0,则两个变量相同,若不为0,则两个变量不同。
已有 1 人评分论坛币 收起 理由
admin_kefu + 30 精彩帖子

总评分: 论坛币 + 30   查看全部评分

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

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