全部版块 我的主页
论坛 计量经济学与统计论坛 五区 计量经济学与统计软件 Stata专版
3889 6
2013-02-19
问题: varlist 中有10个数值型变量(命名无规律), 8个虚拟变量,
   如何对其中的所有 数值型变量 批量创建 如下两个函数型变量
ln_varname = ln( varname )
log_varname = ln( 1 + varname )

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

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

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


        
二维码

扫码加我 拉你入群

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

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

全部回复
2013-2-19 15:36:52
希望得到各位的指教和帮助!
二维码

扫码加我 拉你入群

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

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

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')
   }
}
二维码

扫码加我 拉你入群

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

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

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',
                                                                 创建两个新的变量;

==========================================================================
二维码

扫码加我 拉你入群

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

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

2013-2-20 21:30:26
感谢分享注释
二维码

扫码加我 拉你入群

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

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

2013-2-21 16:17:40
如何设定限定条件: 只针对数值型变量
help ds

ds, has(type numeric)
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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