魔法填充:浅谈多单元格合一及stata横向数据填充

魔法填充:浅谈多单元格合一及stata横向数据填充

  1. 多单元格合一的stata导入规则
    通常,从excel将数据导入stata后,需要重新定义stata的变量名称,如果excel表格首行为需要定义的变量名时,使用import导入时结合firstrow选项能够很容易满足需求。如果首行甚至是前几行为中文名称时,将中文名称作为变量的标签将大大提高变量的易读性。中文表头中可能存在大量的多单元格合一的情况,stata在导入时,通常将多单元格的内容作为多单元格中的第一个单元格的内容进行导入,而其它单元格则为空。如下图中国城市年鉴2019的县级市面板数据中,表格的中文表头较为复杂,不仅存在同行多单元格合一的情况,而且还存在同列多单元格合一的情况。stata在导入该表时,则[A1:B4]四个单元格中,只有单元格A1导入了“中国2018年县级市数据”,而其他三个单元格内容为空。同样,[A3:A5]三个单元格只有A3导入了多单元格的内容“城市”。
    在这里插入图片描述
  2. stata横向填充
    同样以上述表头为例,在导入stata后,我们发现B1的内容为空,其后的E1也为空,但是我们发现D和E对用的都是劳动力就业状况的人数,D对应的是第二产业,E对应的是第三产业,我们在提取中文作为相应变量的标签时不仅需要第一行的内容而且需要第三行的内容,那么对于变量E来讲,首行需要和D的首行相同才能完整表示出变量的中文含义。
    在这里插入图片描述
    如果导入的表有少量的多单元格合一,使用replace并指定改变的行很容易做到,如将E1中的内容填充为D1,则只需repalce E = D[1] in 1 就可实现,但对于表中存在大量的多单元格合一,简单使用replace就显得尤为繁琐。那么我们将思路转向循环,虽然使用foreach可以很容易对变量进行循环,但会遇到一个新的问题,在stata中无法表示前后两个变量的关系,因此,当循环到其中一个变量的时候,无法使用该变量来表示上一变量。
  • 思路1:利用ASCII编码
    ASCII编码中定义了字母A-Z的数字编码,使用asciiasciiplot命令可以很容易列示出A-Z对应的ASCII码,如下图。

在这里插入图片描述
在这里插入图片描述

字母A-Z的ASCII编码为65-91,使用char()函数便可表示出对应的字母。如char(65)显示为A,char(91)显示为Z,我们只需要对数字进行循环,就可以间接对变量A-Z进行循环。

forvalues i = 65/70{
local k = char(`i')
di `k'[1]
lcal n = char(`i'-1)
di `n'[1]
}
  • 思路2:更为一般的方法
    思路1具有较大的局限性,但我们遇到的变量超出A-Z或者变量名是无序的,思路1的解决方法就无能为力。必须寻找更为一般的方法。同样,我们仍然需要对变量进行循环,但和思路1不同,我们将目光转向如何在一次循环后记录变量的值并可供下一次循环使用。scalar或者global无疑帮助我们打开了新世界的大门。两者都能记录变量内容且在下一次重新定义时改变本身的值,这样,我们在进行一次循环后,使用scalar记下变量的内容供下一次循环使用,下一次循环时,首先调用定义的值,然后重新定义并改变定义的值。以上思路还需要注意一个问题,我们必须从第二个变量开始循环,并在循环开始之前就定义好第一个变量的值。以上的思路可以使用如下代码表示:
scalar k = A[1]
foreach v of  varlist B-CQ{
replace `v' = k in 1 if `v'[1]==""&k!=""
scalar k = `v'[1]
}

以上就是本文的全部内容,如果您有新的想法,欢迎交流!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值