考虑一些例子。
变量是数字,但附有标签。标签为“n.a.”的观察已被替换为失误。
clear
input ///
x
1
1
2
3
3
end
label define lblx 1 "a" 2 "b" 3 "n.a."
label values x lblx
list
list, nolabel
foreach var of varlist _all {
replace `var' = .a if `var' == 3
}
list, nolabel
count if missing(x)
变量是字符串类型。字符串被其他字符串替换;就Stata而言,“.a”并不是真正的错误。这只是文字,没有特别的意义。
clear
input ///
str5 x
a
a
b
n.a.
n.a.
end
list
foreach var of varlist _all {
replace `var' = ".a" if `var' == "n.a."
}
list
以下不起作用,也许是你的情况。你有一个数字变量(再次带有标签),你要求Stata检查字符串字符。因此,存在类型不匹配。 (因为在循环中使用引号的)
clear
input ///
x
1
1
2
3
3
end
label define lblx 1 "a" 2 "b" 3 "n.a."
label values x lblx
list
foreach var of varlist _all {
replace `var' = ".a" if `var' == "n.a."
}
正因为如此,你的代码解决,好像他们是字符串类型的变量。如果您想使用扩展缺失值(.a
),那么变量必须是数字。系统错误和延长的错误只适用于他们。 唯一缺少的字符串类型是空白(""
)。
由于您报告的错误,您似乎有数字变量。如果你的变量都是字符串类型,那么你不会得到类型不匹配的错误。尽管如此,你提到了一些“n.a.”的 ,我认为这是价值标签。基于价值标签,是一些数字值。你可以看到他们运行list, nolabel
。
如果是这样的话,你可以replace
对应值标签的数值等于“NA”的东西,如:
clear
*----- example data -----
input ///
x y
1 1
1 4
2 4
3 4
3 2
end
label define lblx 1 "a" 2 "b" 3 "n.a."
label values x lblx
label define lbly 1 "a" 2 "b" 4 "n.a."
label values y lbly
list
list, nolabel
*----- what you want -----
foreach var of varlist _all {
replace `var' = .a if `var' == "n.a.":`:value label `var''
}
// check
list, nolabel
count if missing(x)
count if missing(y)
注意变量x
,值标签n.a.
被映射到值3,而对于变量y
,它被映射到值4.因此,对于一个变量,您想要替换3的值,对于其他值,则为4.代码将自动处理。此外,Stata现在将替代值视为错误。
请参阅help labels
,help missing
和https://stackoverflow.com/a/25942520/2077064,它更详细地解释了replace
中的条件如何工作。
如果您需要选择一种特定类型的变量,Aspen Chen已经提到了ds
。其他选项可以在
中发现的塔塔杂志(2010年) 10,第2号,第281-296, 谈到塔塔:寻找变量, 由尼克·考克斯。 (可在网上免费下载)
请注意,Stata不会为字符串'“.a”附加任何特殊含义'它会为数字值'.a'附加特殊含义。尽管线程是关于如何去做的,但用需要解释的另一个字符串替换字符串值并不是一个明显有用的步骤。 – 2017-11-22 10:37:03