全部版块 我的主页
论坛 计量经济学与统计论坛 五区 计量经济学与统计软件 Stata专版
3547 10
2011-10-12
问题是这样的,因为数据源是比较原始的comma delimited data,于是多余的逗号把本来两个变量的值放到了n个里面去,现在要找出来哪些是分别这两个变量的并把值赋回去
两个变量分别是name和address,name在前,address紧跟在后
name不知道被分成了多少块,address没有多余的逗号,所以在一个ob里面,但是不知道在哪个var那一竖行(v3-v10),并且address如果没有具体的地址将会出现00000,所以我写的是这样的:
foreach n of numlist 10/3 { ;  /*这个n是global的么?里面的内循环的foreach认么?*/  capture drop v`n' ;
  if !_rc { ;
    gen address = v`n';
        replace address = "N/A" if address=="00000";
        
    gen name = "";
      foreach m of numlist `n-1'/3 { ;
          replace name=name + v`m' ;
      } ;
    break ;
   } ;
  else continue ;
} ;



基本的东西我觉得应该没有什么问题,但是后面要用name的时候,提示name这个variable是undefined,于是我就纳了个闷了,高手瞅一眼指导一下(难道在循环里面生成的变量不是全局变量?但这个不是只有宏才该有的问题么。。。)
二维码

扫码加我 拉你入群

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

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

全部回复
2011-10-12 14:43:50
gen nam=v3+","+v4+","+v5+","+v6+","+v7+","+v8+","+v9+","+v10
replace nam=subinstr(nam,",00000","",.)
replace nam=reverse(nam)
replace nam=subinstr(nam,",","@",1)
replace nam=reverse(nam)
split nam,gen(name) p(@)
ren name1 name
ren name2 adrress

二维码

扫码加我 拉你入群

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

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

2011-10-12 20:43:30
gen name=v3+","+v4+","+v5+","+v6+","+v7+","+v8+","+v9+","+v10
replace name=subinstr(name,",00000","",.)
egen address=ends(name),p(,) l
replace name=subinstr(name,","+address,"",.)
二维码

扫码加我 拉你入群

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

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

2011-10-14 03:48:14
jzhyue 发表于 2011-10-12 20:43
gen name=v3+","+v4+","+v5+","+v6+","+v7+","+v8+","+v9+","+v10
replace name=subinstr(name,",00000"," ...
谢谢
这个程序是个子程序,有一个母程序导入,由于有多个数据库,每个导入时生成的变量数不同,所以要先检查一共有多少个变量,所以我才拿capture来检测v`n'是否存在(当然,上面那个写错了,应该是capture confirm v v`n')
然后知道最大的变量是几之后还得检查变量是否为空,
并且,address后面依然可能有空的变量,如果直接用你的句子就可能最后有几个逗号。
所以在用v3+v4+v5....+v`n'之前还要判断这个变量是否为空
我改了一下成下面的样子,但是报错说varlist not allowed,r(101);我不知道多重循环改怎么弄,麻烦你帮忙看看

gen str40 name="";

foreach n of numlist 10/4 {
  capture confirm v v`n';
  if _rc==0 {
    foreach m of numlist `n'/3{
    replace name=name+v`m'+",";
        }
  }
  else continue ;
}

replace name=substr(name,1,length(name)-1)
egen address=ends(name),p(,) l
replace name=substr(name,1,length(name)-length(address))
replace name=subinstr(name,","," ",.)
二维码

扫码加我 拉你入群

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

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

2011-10-14 10:00:50
professionaldu 发表于 2011-10-14 03:48
谢谢
这个程序是个子程序,有一个母程序导入,由于有多个数据库,每个导入时生成的变量数不同,所以要先 ...
没有看清你的要求,还认为address后面的空变量是用"00000"表示呢.
如果用你的思路,需要你提供示例数据方能调试.
不过总觉得有些繁
二维码

扫码加我 拉你入群

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

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

2011-10-14 10:42:21
*试一下这个,不受变量多少的限,但受变量命名法则和字符串长度的限制,好像stata12字符串长度比较的长
foreach i of varlist v*{
replace name=name+`i'+"     "
}
replace name=rtrim(name)
replace name=subinstr(name,"     ",",",.)
egen address=ends(name),p(,) l
replace name=subinstr(name,","+address,"",.)
replace address=subinstr(address,"00000","N/A",.)
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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