楼主: monstersivle
8628 22

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

11
大白菜2012 发表于 2012-12-8 00:37:53
fgleric 发表于 2012-12-8 00:32
???难道不是

gen first=substr(var,1,1)?
提取字串中每个单词首字母的功能
                 *************




"Japan is sinking"


-----> "JIS"
元芳,侬怎么L00K?

12
monstersivle 发表于 2012-12-8 09:09:20
fgleric 发表于 2012-12-8 00:32
???难道不是

gen first=substr(var,1,1)?
不是这个,这个指令只能做到提取整个字串的首字母。
想处理的case是:字串有好几个单词,提取每个单词的首字母,比如Gross Domestic Product 提取完是GDP.
Age Dependency Rate提取完是ADR.

而substr("...",1,1)的结果分别是G和A。
不爱其亲而爱他人者,谓之悖德;不敬其亲而敬他人者,谓之悖礼。——《孝经》

13
fgleric 发表于 2012-12-8 09:18:07
monstersivle 发表于 2012-12-8 09:09
不是这个,这个指令只能做到提取整个字串的首字母。
想处理的case是:字串有好几个单词,提取每个单词的 ...
貌似stata没这个命令
我能想到的就是先split,然后提取首字母组合

14
monstersivle 发表于 2012-12-8 09:39:48
大白菜2012 发表于 2012-12-7 23:16
不需要这么复杂,

reshape long varname,i(id var) j(year)
好的,非常感谢!的确,手动rename和label更实用,即便split,substr,再合并生成首字母缩写的话,效果也不好,弃。
不爱其亲而爱他人者,谓之悖德;不敬其亲而敬他人者,谓之悖礼。——《孝经》

15
monstersivle 发表于 2012-12-8 09:52:59
fgleric 发表于 2012-12-8 09:18
貌似stata没这个命令
我能想到的就是先split,然后提取首字母组合
好的,多谢。
后来发现首字母缩写这个不太实用,比如原先字串中有分割号什么的,,(%,就废了。
还是手动命名吧。
不爱其亲而爱他人者,谓之悖德;不敬其亲而敬他人者,谓之悖礼。——《孝经》

16
monstersivle 发表于 2012-12-8 09:54:12
fgleric 发表于 2012-12-8 09:18
貌似stata没这个命令
我能想到的就是先split,然后提取首字母组合
好的,多谢。
后来发现首字母缩写这个不太实用,比如原先字串中有分割号什么的,,(%,就废了。
还是手动命名吧。
不爱其亲而爱他人者,谓之悖德;不敬其亲而敬他人者,谓之悖礼。——《孝经》

17
monstersivle 发表于 2012-12-8 09:55:02
fgleric 发表于 2012-12-8 09:18
貌似stata没这个命令
我能想到的就是先split,然后提取首字母组合
好的,多谢。
后来发现首字母缩写这个不太实用,比如原先字串中有分割号什么的,,(%,就废了。
还是手动命名吧。
不爱其亲而爱他人者,谓之悖德;不敬其亲而敬他人者,谓之悖礼。——《孝经》

18
sungmoo 发表于 2012-12-9 10:28:44
想处理的case是:字串有好几个单词,提取每个单词的首字母
loc a="Mr. John A. Smith"
forv i=1/`=wordcount("`a'")'{
loc b="`b'"+substr(word("`a'",`i'),1,1)
}
di "`b'"
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
monstersivle + 1 + 1 + 1 观点有启发

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

19
sungmoo 发表于 2012-12-9 11:46:50
*假设内存中的数据库变量是id、var、y2012、y2011、……、y1990
reshape long y,i(id var) j(year) s
egen v=group(var)
levelsof var,l(v)
token `"`v'"',p("' `")
drop var
reshape wide y,i(id year) j(v)
forv i=1/20{
la var y`i' `"``i''"'
}
已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
Sunknownay + 100 + 5 + 1 + 1 + 1 热心帮助其他会员
monstersivle + 1 + 1 + 1 观点有启发

总评分: 经验 + 100  论坛币 + 5  学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

20
monstersivle 发表于 2012-12-11 10:36:08
sungmoo 发表于 2012-12-9 11:46
*假设内存中的数据库变量是id、var、y2012、y2011、……、y1990
reshape long y,i(id var) j(year) s
e ...
forvalues i=1/20{
    la var y`i' `"``i''"'
}
这里没有达到预期效果:
应该是想要把刚才levelsof var, local(v)生成的v里的20个变量标签 贴到y1-y20上。
可能的出错原因是macro list 里面没有v,我想也许: 如果能用global的话,就能存下来了。
源码:
insheet using big.csv, names clear
foreach i of numlist 3/25 {
        local j=2015-`i'
        rename v`i' y`j'
}
save big.dta,replace
reshape long y,i(id var) j(year) string
egen v=group(var)
levelsof var,local(v)
token `"`v'"',p("' `")
drop var
reshape wide y,i(id year) j(v)
forvalues i=1/20{
label var y`i' `"``i''"'
}
不爱其亲而爱他人者,谓之悖德;不敬其亲而敬他人者,谓之悖礼。——《孝经》

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

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