楼主: shetianlang
3642 8

[编程问题求助] 如何将所有变量中的NA/DK记录变为missing [推广有奖]

  • 6关注
  • 10粉丝

已卖:1173份资源

讲师

52%

还不是VIP/贵宾

-

TA的文库  其他...

微观数据研讨

威望
0
论坛币
25816 个
通用积分
31.3029
学术水平
85 点
热心指数
94 点
信用等级
63 点
经验
16219 点
帖子
406
精华
0
在线时间
494 小时
注册时间
2008-11-27
最后登录
2023-1-5

楼主
shetianlang 发表于 2014-11-7 05:58:15 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
如题,有些变量是数值型,大部分有value label,其中77的value label为NA,99的value label为DK。另外一些变量为字符串型。我想用一个loop来解决问题,但是因为没有排除字符串型变量,出现了错误:
foreach v of var * {
        replace `v'=. if `v'==77| `v'==99
}

type mismatch
r(109);

请问怎么样能有value label的变量单独挑出来执行转变操作?也就是说,我需要在if语句中加一个条件来鉴别v是包含value label的。
或者有什么其他更好的办法?
非常感谢!
二维码

扫码加我 拉你入群

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

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

关键词:missing SSIN Miss Iss ING

回帖推荐

ywh19860616 发表于6楼  查看完整内容

这样?

本帖被以下文库推荐

文库:微观数据研讨

沙发
ywh19860616 发表于 2014-11-7 09:35:40
  1.    label drop
复制代码

藤椅
shetianlang 发表于 2014-11-7 09:47:04
ywh19860616 发表于 2014-11-7 09:35
但是label很重要,我不能drop

板凳
ywh19860616 发表于 2014-11-7 09:53:14
  1. label save
复制代码

先用label save储存成另一个变量,再drop也可以

还有,从语法上来看,你用的命令是可以的。

比如,
  1. webuse hbp4,clear
  2. replace female=2 if female==1
  3. replace female=-2 if female==0
复制代码

报纸
shetianlang 发表于 2014-11-7 10:02:48
ywh19860616 发表于 2014-11-7 09:53
先用label save储存成另一个变量,再drop也可以

还有,从语法上来看,你用的命令是可以的。
谢谢指点。我还是没有看懂你的方法,也许是我没有说清楚问题。我试着再讲一下:
比如说我有100个变量,其中80个变量是数值型的,比如v1,并且都有value label。在他们的value label中77代表NA, 99代表DK。其他20个变量是字符串型的,比如v20,都没有value label。
现在我要把所有observation中这80个变量的77(NA)和99(DK)值都改成.(missing value),一个个太费事,所以我想到用loop来解决,但是出现了错误,原因在于v20等字符型变量跟数值77、99不match。
我的问题是:如何从所有变量中把有value label的单独挑出来?

地板
ywh19860616 发表于 2014-11-7 10:35:14
shetianlang 发表于 2014-11-7 10:02
谢谢指点。我还是没有看懂你的方法,也许是我没有说清楚问题。我试着再讲一下:
比如说我有100个变量,其 ...
  1. // generate the data
  2. clear *
  3. set obs 10
  4. forv i = 1/20 {
  5. gen x`i' = uniform()
  6. replace x`i' = 1 if x`i'>0.5
  7. replace x`i' = 0 if x`i'<=0.5
  8. }

  9. forv i = 1/10 {
  10. label define v`i' 0 "no" 1 "yes"
  11. label value x`i' v`i'
  12. }

  13. forv i = 11/20 {
  14. tostring x`i',replace
  15. }

  16. // replace
  17. ds,not(type string)
  18. di "`r(varlist)'"
  19. local numvar `r(varlist)'
  20. foreach x of local numvar {
  21. replace `x' = 2 if `x'==0
  22. replace `x' = 3 if `x'==1
  23. }
复制代码
这样?
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
shetianlang + 5 + 2 + 2 + 2 精彩帖子

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

7
ywh19860616 发表于 2014-11-7 10:38:26
也就是说,我需要在if语句中加一个条件来鉴别v是包含value label的。


这个通过ds命令来实现或者用confirm命令。

8
shetianlang 发表于 2014-11-7 11:15:16
ywh19860616 发表于 2014-11-7 10:38
也就是说,我需要在if语句中加一个条件来鉴别v是包含value label的。
非常感谢!这个完全可行!

9
shetianlang 发表于 2014-11-7 11:28:02
ywh19860616 发表于 2014-11-7 10:35
这样?
学习了,如下两个代码同样可行:
  1. // generate the data
  2. clear *
  3. set obs 10
  4. forv i = 1/20 {
  5. gen x`i' = uniform()
  6. replace x`i' = 1 if x`i'>0.5
  7. replace x`i' = 0 if x`i'<=0.5
  8. }

  9. forv i = 1/10 {
  10. label define v`i' 0 "no" 1 "yes"
  11. label value x`i' v`i'
  12. }

  13. forv i = 11/20 {
  14. tostring x`i',replace
  15. }

  16. // replace
  17. foreach x of var * {
  18. capture confirm numeric variable `x'
  19. if !_rc {
  20. replace `x' = 2 if `x'==0
  21. replace `x' = 3 if `x'==1
  22. }

  23. }
复制代码
  1. // generate the data
  2. clear *
  3. set obs 10
  4. forv i = 1/20 {
  5. gen x`i' = uniform()
  6. replace x`i' = 1 if x`i'>0.5
  7. replace x`i' = 0 if x`i'<=0.5
  8. }

  9. forv i = 1/10 {
  10. label define v`i' 0 "no" 1 "yes"
  11. label value x`i' v`i'
  12. }

  13. forv i = 11/20 {
  14. tostring x`i',replace
  15. }

  16. // replace
  17. foreach x of var * {
  18. if substr("`:type `x''",1,3) != "str" {
  19. replace `x' = 2 if `x'==0
  20. replace `x' = 3 if `x'==1
  21. }

  22. }
复制代码
文库:微观数据研讨

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

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