楼主: hiderm
3614 6

[数据管理求助] 求助成功: 如何对 varlist 中的 多个命名无规律的 数值型变量 批量创建 其对数函数变 [推广有奖]

院士

51%

还不是VIP/贵宾

-

威望
1
论坛币
57071 个
通用积分
3907.3837
学术水平
253 点
热心指数
329 点
信用等级
219 点
经验
74531 点
帖子
2124
精华
1
在线时间
2666 小时
注册时间
2006-6-3
最后登录
2024-4-23

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
问题: varlist 中有10个数值型变量(命名无规律), 8个虚拟变量,
   如何对其中的所有 数值型变量 批量创建 如下两个函数型变量
ln_varname = ln( varname )
log_varname = ln( 1 + varname )

我目前的想法是 用foreach命令, 难点在于:

1. 如何设定限定条件: 只针对数值型变量

2. 如何使得新生成的两种函数型的变量的名称符合上述两个表达式


        
二维码

扫码加我 拉你入群

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

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

关键词:varlist 命名无规律 list 对数函数 求助成功 数据库 命名 对数函数 如何

[b][color=Red]提请应助者注意:请不要上传draft或者wp版本,谢谢!因为这些版本我自己用谷歌搜索就可以搜到并免费下载
沙发
hiderm 发表于 2013-2-19 15:36:52 |只看作者 |坛友微信交流群
希望得到各位的指教和帮助!
[b][color=Red]提请应助者注意:请不要上传draft或者wp版本,谢谢!因为这些版本我自己用谷歌搜索就可以搜到并免费下载

使用道具

藤椅
arlionn 在职认证  发表于 2013-2-20 10:21:20 |只看作者 |坛友微信交流群
local x "x1 x2"   // 填入所有变量名称
foreach v of varlist `x'{
   local ty: type `v'
   local ty = substr("`ty'", 1, 3)
   if "`ty'" != "str"{
       gen ln_`v' = ln(`v')
       gen log_`v' = ln(1+`v')
   }
}

使用道具

板凳
hiderm 发表于 2013-2-20 12:33:46 |只看作者 |坛友微信交流群
arlionn 发表于 2013-2-20 10:21
local x "x1 x2"   // 填入所有变量名称
foreach v of varlist `x'{
   local ty: type `v'
连老师,非常感谢您的回复和帮助!

以下是参考
help local
help data type
help substr
对连老师回复的解决方案的注释(// 后面蓝色字体的内容).
便于自己和其他坛友学习领会. 如果有解释的不对地方, 还请各位坛友指正.
==========================================================================
local x "x1 x2"   // 填入所有变量名称    // 定义局部宏 `x' 为 前后双引号("")中所引用的元素
foreach v of varlist `x'{                         // 循环开始, 设定循环条件: 定义局部宏 `v' 为分项清单(此处为变量列表 varlist)
                                                                  
的每一项
   local ty: type `v'                                // 利用拓展的宏函数( typevarname )定义局部宏 `ty' 为`v' 所指的变量的
                                                                  
数据存储格式, 包括: int, long, float, double, str1, str2 等.
   local ty = substr("`ty'", 1, 3)             // 利用函数substr(s,n1,n2), 定义局部宏(新的)`ty' 为(原有的)局部宏`ty' 的
                                                                  表达式(添加了双引号)的子字符串, n1表示提取子字符串的起始位置(这里是
                                                                  从左起第1个字符开始), n2表示子字符串的提取长度(这里是选取3个字符).
   if "`ty'" != "str"{                               // 告知stata, if (新的)局部宏`ty'的表达式(添加双引号) 不等于 "str", 则利用
                                                                 generate 命令完成两项任务:
       gen ln_`v' = ln(`v')                       // (a) 创建变量名为  ln_`v' 的新变量1, 是`v'所代表的变量的取值的对数函数值;
       gen log_`v' = ln(1+`v')                // (b) 创建变量名为log_`v' 的新变量2, 是`v'所代表的变量的取值加1的对数函数值;
   }                                                       // if条件语句结束
}                                                          // foreach循环语句结束, foreach循环内完成3项任务:
                                                              (1) 定义局部宏`ty' 为局部宏`v' 的数据存储类型;
                                                              (2) 定义新的局部宏`ty'为原有的局部宏`ty' 的表达式(添加了双引号)的前3个字符;
                                                              (3) 对满足 if 语句的局部宏`v', 即数据存储类型类型不是字符型(!="str")的`v',
                                                                 创建两个新的变量;

==========================================================================
[b][color=Red]提请应助者注意:请不要上传draft或者wp版本,谢谢!因为这些版本我自己用谷歌搜索就可以搜到并免费下载

使用道具

报纸
qiaqiao 发表于 2013-2-20 21:30:26 |只看作者 |坛友微信交流群
感谢分享注释

使用道具

地板
sungmoo 发表于 2013-2-21 16:17:40 |只看作者 |坛友微信交流群
如何设定限定条件: 只针对数值型变量
help ds

ds, has(type numeric)

使用道具

7
arlionn 在职认证  发表于 2013-2-22 17:31:23 |只看作者 |坛友微信交流群
hiderm 发表于 2013-2-20 12:33
连老师,非常感谢您的回复和帮助!

以下是参考
这个注释很详尽,呵呵。

使用道具

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

本版微信群
加好友,备注jltj
拉您入交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-2 02:15