楼主: wyy19860530
13882 6

[其他] 关于循环语句的问题 [推广有奖]

  • 0关注
  • 0粉丝

硕士生

7%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
892 点
帖子
59
精华
0
在线时间
164 小时
注册时间
2007-4-18
最后登录
2018-12-19

楼主
wyy19860530 在职认证  发表于 2009-9-27 22:43:04 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
我有如下的程序,我想把他写成一个循环语句,这样更简单

        use x1
        replace st_name = "ar" if ( n_th_row <= 480 )
        forvalues i = 1971/2009 {
        replace year = `i' if (ysupport >= 12 * (`i'-1970) + 1 & ysupport <= 12 * ((`i'- 1970 + 1 )))
        }
        save x.dta, replace
        clear        
        use x2
        replace st_name = "ne" if ( n_th_row <= 480 )
        forvalues i = 1971/2009 {
        replace year = `i' if (ysupport >= 12 * (`i'-1970) + 1 & ysupport <= 12 * ((`i'- 1970 + 1 )))
        }
        save y.dta, replace
        clear
        use x3
        replace st_name = "ky" if ( n_th_row <= 480 )
        forvalues i = 1971/2009 {
        replace year = `i' if (ysupport >= 12 * (`i'-1970) + 1 & ysupport <= 12 * ((`i'- 1970 + 1 )))
        }        
        save z.dta, replace
        use x4
        replace st_name = "wv" if ( n_th_row <= 480 )
        forvalues i = 1971/2009 {
        replace year = `i' if (ysupport >= 12 * (`i'-1970) + 1 & ysupport <= 12 * ((`i'- 1970 + 1 )))
        }
        save zz.dta, replace
我的循环语句是:

        local s = 0
        foreach v in ar ne ky wv {
        local s = `s' + 1
        use x`s'
        replace st_name = "`v'" if (n_th_row <= 480)
        forvalues i = 1971/2009 {
        replace year = `i' if (ysupport >= 12 * ((`i'-1970) + 1) & ysupport <= 12 * ((`i'- 1970 + 1 )))
        }
        save x`s'.dta, replace
        }        
        }

但是运行了半天,还是出不来结果啊。。。高手们可以帮我看一下么?

还有一个问题,我有如下的stata语句
        gen mw_frst90_y_ky_1 = 3.35
        gen mw_frst90_y_ky_3 = 3.61
        gen mw_frst90_y_ky_5 = 9999

        gen mw_frst90_y_ky_year_1 = 1990
        gen mw_frst90_y_ky_year_2 = 1991
        gen mw_frst90_y_ky_year_3 = 1991
        gen mw_frst90_y_ky_year_4 = 1993
        gen mw_frst90_y_ky_year_5 = 1993
        gen mw_frst90_y_ky_year_6 = 2010

        gen mw_frst90_y_ky_month_1 = 7
        gen mw_frst90_y_ky_month_2 = 6
        gen mw_frst90_y_ky_month_3 = 7
        gen mw_frst90_y_ky_month_4 = 3
        gen mw_frst90_y_ky_month_5 = 4
        gen mw_frst90_y_ky_month_6 = 12

        forvalues k = 1(2)5 {
        local j = `k' + 1
        replace mw_frst90_y = mw_frst90_y_ky_`k' if ((year >= mw_frst90_y_ky_year_`k') & (month >= mw_frst90_y_ky_month_`k')) & ((year <= mw_frst90_y_ky_year_`j') & (month <= mw_frst90_y_ky_month_`j')) & (st_id == 27)
        }

这个语句的作用就是对mw_frst90_y这个变量产生一个step function(分段函数),比如gen mw_frst90_y_ky_1 = 3.35;gen mw_frst90_y_ky_year_1 = 1990       gen mw_frst90_y_ky_year_2 = 1991;         gen mw_frst90_y_ky_month_1 = 7       gen mw_frst90_y_ky_month_2 = 6 这个语句意思就是mw_frst90_y在1990年7月到1991年6月的值是3.35. 现在的问题是如果用replace语句的话,最中间的那个 & 会导致符合这个条件的变量个数为0,因为month不可能又大于7又小于6,但是对于比如1990年1月到1992年4月,这个语句就没问题,现在的问题是,如何让这个语句也能适应那种第一个Month的值大于第二个Month的值呢?


非常感谢大家了
二维码

扫码加我 拉你入群

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

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

关键词:循环语句 replace place name PLA replace 程序

回帖推荐

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

你能直接把这个分段函数的数学表达式写一下吗?

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

其中,use x`s'改成use x`s',clear 另外,最后多了一个“}”吧?

沙发
sungmoo 发表于 2009-9-28 12:07:59
wyy19860530 发表于 2009-9-27 22:43 我的循环语句是:
        local s = 0
        foreach v in ar ne ky wv {
        local s = `s' + 1
        use x`s'
        replace st_name = "`v'" if (n_th_row <= 480)
        forvalues i = 1971/2009 {
        replace year = `i' if (ysupport >= 12 * ((`i'-1970) + 1) & ysupport <= 12 * ((`i'- 1970 + 1 )))
        }
        save x`s'.dta, replace
        }        
        }
其中,use x`s'改成use x`s',clear

另外,最后多了一个“}”吧?

藤椅
sungmoo 发表于 2009-9-28 12:12:52
wyy19860530 发表于 2009-9-27 22:43 这个语句的作用就是对mw_frst90_y这个变量产生一个step function(分段函数)
你能直接把这个分段函数的数学表达式写一下吗?

板凳
wyy19860530 在职认证  发表于 2009-9-28 21:57:39
在时间段1990年7月到1991年6月,mw_frst90_y = 3.35, 在时间段1991年7月到1993年3月,mw_frst90_y= 3.61, 在时间段1993-2010, mw_frst90_y=9999,就是产生这么一个step fuction,或者说分段函数

报纸
sungmoo 发表于 2009-9-30 18:36:41
wyy19860530 发表于 2009-9-28 21:57 在时间段1990年7月到1991年6月,mw_frst90_y = 3.35, 在时间段1991年7月到1993年3月,mw_frst90_y= 3.61, 在时间段1993-2010, mw_frst90_y=9999,就是产生这么一个step fuction,或者说分段函数
表达时间段的变量是什么?其类型是什么?

地板
wyy19860530 在职认证  发表于 2009-10-4 12:38:08
表达时间段的变量是:mw_frst90_y_ky_year_k 和mw_frst90_y_ky_month_k,就是定义的时间变量,是一个范围,后来我问了一个老师,他说要对于这种year_k >year_j的情况要分情况讨论,具体说,就是定义month_begin
和month_end这两个变量
1. if month_begin =< month_end, 就可以用上述的replace语句来做
2. if month_begin > month_end,
比如gen mw_frst90_y_ky_1 = 3.35;gen mw_frst90_y_ky_year_1 = 1990       gen mw_frst90_y_ky_year_2 = 1991;         gen mw_frst90_y_ky_month_1 = 7       gen mw_frst90_y_ky_month_2 = 6 这个语句意思就是mw_frst90_y在1990年7月到1991年6月的值是3.35.
语句的目的就要从1990年7月到1990年12月,mw_frst90_y=3.35
然后1991年1月到1991年6月,mw_frst90_y=3.35

具体的思路就是这样,但是如果每个州的情况,我指的是情况2的中间间隔的时间各个都不一致,这个应该怎么处理呢?

非常感谢!

7
wyy19860530 在职认证  发表于 2009-10-4 13:48:09
我现在做出来的结果是:

gen mw_frst90_y_ky_1 = 3.35
gen mw_frst90_y_ky_2 = 3.61
gen mw_frst90_y_ky_3 = 9999

gen mw_frst90_y_ky_year_begin_1 = 1990
gen mw_frst90_y_ky_year_end_1 = 1991
gen mw_frst90_y_ky_year_begin_2 = 1991
gen mw_frst90_y_ky_year_end_2 = 1993
gen mw_frst90_y_ky_year_begin_3 = 1993
gen mw_frst90_y_ky_year_end_3 = 2010

gen mw_frst90_y_ky_month_begin_1 = 7
gen mw_frst90_y_ky_month_end_1 = 6
gen mw_frst90_y_ky_month_begin_2 = 7
gen mw_frst90_y_ky_month_end_2 = 3
gen mw_frst90_y_ky_month_begin_3 = 4
gen mw_frst90_y_ky_month_end_3 = 12

forvalues k = 1(1)3 {
local j = `k' + 1

gen

if mw_frst90_y_ky_month_begin_`k' < mw_frst90_y_ky_month_begin_`k'
{replace mw_frst90_y = mw_frst90_y_ky_`k' if ((year >= mw_frst90_y_ky_year_begin_`k') & (month >=

mw_frst90_y_ky_month_begin_`k')) & ((year <= mw_frst90_y_ky_year_end_`k') & (month <= mw_frst90_y_ky_month_end_`k')) & (st_id

== 27) }

if mw_frst90_y_ky_month_begin_`k'> mw_frst90_y_ky_month_begin_`k'
{replace mw_frst90_y = mw_frst90_y_ky_`k' if ((year >= mw_frst90_y_ky_year_begin_`k') & (month >=

mw_frst90_y_ky_month_begin_`k')) & ((year <= mw_frst90_y_ky_year_begin_`k') & (month <= 12)) & (st_id == 27) }

replace mw_frst90_y = mw_frst90_y_ky_`k' if ((year >= mw_frst90_y_ky_year_end_`k') & (month >= 1) & ((year <=

mw_frst90_y_ky_year_end_`k') & (month <= mw_frst90_y_ky_month_end_`k')) & (st_id == 27) }

replace mw_frst90_y = mw_frst90_y_ky_`k' if ((year >= mw_frst90_y_ky_year_begin_`j') & (month >= 1)) & ((year <=

mw_frst90_y_ky_year_end_`') & (month <= 12))
}

现在主要的问题是最后一个语句(加黑体的)我想把mw_frst90_y_ky_year_end_`k' 那个变量的值,比如说1991提取出来,然后将这个值减去1,这样把1990年7月到1991年6月这个时间段分成三段处理: 1990年7月到12月,1991年1月到6月,还有1991年1月到1990年12月(其实这个时间段为空,但是为了一般意义的作用,因为时间段可能超过1年),问题是这个是不是要讲local变量的字符串形式转化成为数值形式呢?然后再将其转化为字符串?加黑体的地方时我拿不准的地方,希望高手们多多帮助啊

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

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