楼主: monstersivle
8626 22

[数据管理求助] 关于数据库转置(改变维度wide->long) [推广有奖]

已卖:66份资源

博士生

7%

还不是VIP/贵宾

-

威望
0
论坛币
359 个
通用积分
240.8846
学术水平
40 点
热心指数
51 点
信用等级
22 点
经验
3520 点
帖子
215
精华
0
在线时间
187 小时
注册时间
2012-10-29
最后登录
2016-7-23

楼主
monstersivle 发表于 2012-12-5 03:16:17 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
各位好,
我是rookie,在world bank的data bank里下载了Data set:
平板panel数据(cross section + time):

country (10) variables(20) year (20)

每一国家有20个变量, 每个变量有20个值(按年份)
基本是wide的
参见附件:
big.xls (88.5 KB)

如果一个变量一个变量地reshape long var, i(...) j(...)
很麻烦,有没有便捷一点的方法?

用个循环?
先变量名都整理出来,然后每次keep if var="变量名"
一个个单独存成一个tab`i'.dta
keep if var=="varname"
save tab1.dta
br
foreach i of numlist 3/25{
        rename v`i' varname`i+1975'
}
drop var
reshape long varname, i(id) j(year)
* 年份是从1990-2012, 原来有
foreach i of numlist 3/25{
        replace year=1985+`i' if year==`i'
}
label var varname "indicator name"

想是把上述步骤,做成个循环。
之后, merge
use tab1.dta,clear
foreach i of numlist 2/10 {
        merge 1:1 id year using tab`i'.dta
        drop _merge
}

save work.dta

有没有办法把那些个变量名(重新起名字)和标签名(原变量名)分别存在两个向量里,然后loop的时候,按着index提取。

或者Stata 有没有做类似事情的ado-file?或是有没有相关帖子?

各位一般都怎么搜集、整理数据呢?

麻烦各位答疑解惑,先谢谢了。

二维码

扫码加我 拉你入群

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

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

关键词:long wide wid IDE 数据库 数据库 long

回帖推荐

大白菜2012 发表于2楼  查看完整内容

clear insheet using C:\Users\Desktop\big.csv, names c sort id var egen vargp=group(var) foreach i of numlist 3/25{ local j=2015-`i' rename v`i' varname`j' } reshape long varname,i(id var) j(year) drop var reshape wide varname,i(id year) j(vargp) rename varname1 .................. .............. //now the data is ready for panel analysis
不爱其亲而爱他人者,谓之悖德;不敬其亲而敬他人者,谓之悖礼。——《孝经》

沙发
大白菜2012 发表于 2012-12-5 04:21:58
clear
insheet using C:\Users\Desktop\big.csv, names c

sort id var
egen vargp=group(var)

foreach i of numlist 3/25{
local j=2015-`i'
rename v`i' varname`j'
}

reshape long varname,i(id var) j(year)

drop var

reshape wide varname,i(id year) j(vargp)



rename varname1 ..................
..............
//now the data is ready for panel analysis



元芳,侬怎么L00K?

藤椅
shetianlang 发表于 2012-12-6 10:41:27
reshape long varlist(20个变量的列表), i(country) j(year)

country要先转换为数字格式,可用encode
文库:微观数据研讨

板凳
monstersivle 发表于 2012-12-7 06:08:31
大白菜2012 发表于 2012-12-5 04:21
clear
insheet using C:\Users\Desktop\big.csv, names c
非常感谢。

发帖后,我用循环整理了一个*.dta,方法就是一个一个变量分着做,每次重新引用big.csv,然后keep if var=="age dependency rate..." 这么着做完之后rename+label的。
你的group函数相当便捷, 还有这套wide-> long -> wide (j用vargp)真是通透啊!

最后rename那里想做些改善:
如果可以把一开始的var变量里的不同值提取出来存在一个(临时)向量(label)里;
然后在label的基础上,生成一个(变量名称缩写)的向量,叫acronym,
也就是说,需要一个指令能够执行提取字串中每个单词首字母的功能,
(不知道有没有Stata用户编写的类似命令,即String系列指令)。

好,现在就是生成了2个(临时)向量: label, acronym

drop var
reshape wide v, i(id year) j(vargp)

在最后就可以做个循环,用label给变量v1-v20加标签,然后再用acronym给v1-v20重命名,但是一些对应的指令不知道
foreach i of numlist 1/20{
  label var v`i' "label"  %% 意会,中括号[]里面为索引
rename v`i' acronym %% 意会,不知道正确的指令怎么写
}

save done.dta,replace


在R里面提取不同值的指令是unique(),不知道Stata有没有类似的,或是自己编一个,利用标量——_n,_N ?
尝试了一下提取distinct values of a variable:
bysort var: gen nvals=_n==1
encode var, gen(varnum) %% transform strings to numeric type
mkmat varnum if nvals==1, nomissing matrix(label)
svmat label
结果就错了存进矩阵的字串全变成数字了,即1,……,20,就这20个,其它为.(missing values)
有啥办法没?
不爱其亲而爱他人者,谓之悖德;不敬其亲而敬他人者,谓之悖礼。——《孝经》

报纸
大白菜2012 发表于 2012-12-7 11:24:00
monstersivle 发表于 2012-12-7 06:08
非常感谢。

发帖后,我用循环整理了一个*.dta,方法就是一个一个变量分着做,每次重新引用big.csv,然 ...
需要一个指令能够执行提取字串中每个单词首字母的功能,
(不知道有没有Stata用户编写的类似命令,即String系列指令)。


-----------no
元芳,侬怎么L00K?

地板
大白菜2012 发表于 2012-12-7 11:28:04
monstersivle 发表于 2012-12-7 06:08
非常感谢。

发帖后,我用循环整理了一个*.dta,方法就是一个一个变量分着做,每次重新引用big.csv,然 ...
在最后就可以做个循环,用label给变量v1-v20加标签,然后再用acronym给v1-v20重命名,但是一些对应的指令不知道
foreach i of numlist 1/20{
  label var v`i' "label"  %% 意会,中括号[]里面为索引
rename v`i' acronym %% 意会,不知道正确的指令怎么写
}





---------不要用循环,因为变量名都是不一样的。才20个变量,copy,paste,花不了多久
元芳,侬怎么L00K?

7
大白菜2012 发表于 2012-12-7 11:29:58
monstersivle 发表于 2012-12-7 06:08
非常感谢。

发帖后,我用循环整理了一个*.dta,方法就是一个一个变量分着做,每次重新引用big.csv,然 ...
在R里面提取不同值的指令是unique(),不知道Stata有没有类似的,




---------why?
元芳,侬怎么L00K?

8
monstersivle 发表于 2012-12-7 18:22:27
大白菜2012 发表于 2012-12-7 11:29
在R里面提取不同值的指令是unique(),不知道Stata有没有类似的,

foreach i of numlist 1/20{
  label var v`i' label[`i']  %% 意会,中括号[]里面为索引
rename v`i' acronym[`i'] %% 意会,不知道正确的指令怎么写
}
label[`i'] 这个index之前没打上。

R里unique()的作用,案例:
> x<-c(1,1,2,4,5,2,9,10,4)
> unique(x)
[1]  1  2  4  5  9 10

unique()在此的用意,就是提取distinct labels
age dependency rate重复了10遍(因为10个国家),但其实只需要一个值做变量标签,其它的也是,
就是想做成:
*.dta源数据(变量型)——>矩阵(或向量)——>*.dta变量型

有些操作可以在*.dta -> *.dta的基础上做,比如reshape long/wide

有些得从矩阵绕一下,比如labels,rename,需要利用矩阵(或向量)里的索引功能,即[`i']
不爱其亲而爱他人者,谓之悖德;不敬其亲而敬他人者,谓之悖礼。——《孝经》

9
大白菜2012 发表于 2012-12-7 23:16:41
monstersivle 发表于 2012-12-7 18:22
foreach i of numlist 1/20{
  label var v`i' label[`i']  %% 意会,中括号[]里面为索引
rename v`i'  ...
不需要这么复杂,

reshape long varname,i(id var) j(year)

drop var

reshape wide varname,i(id year) j(vargp)



之后,整个data的数据结构已经是
country         year             var1               var2                       
china            1990
..................


你只要rename1 那些个var1-var20就done了


元芳,侬怎么L00K?

10
fgleric 发表于 2012-12-8 00:32:56
大白菜2012 发表于 2012-12-7 11:24
需要一个指令能够执行提取字串中每个单词首字母的功能,
(不知道有没有Stata用户编写的类似 ...
???难道不是

gen first=substr(var,1,1)?

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

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