考虑一些例子。
变量是数字但带有标签。带有“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),那么变量必须是数字。系统缺失和扩展缺失仅适用于它们。
字符串类型唯一缺少的是空白 ("")。
由于您报告的错误,您似乎有数字变量。如果您的变量都是字符串类型,那么您将不会收到类型不匹配错误。尽管如此,你提到
一些“不适用” ,我认为这是价值标签。值标签的基础是一些数值。你可以看到他们在运行list, nolabel。
如果是这种情况,您可以replace 对应于等于“n.a.”的值标签的数值,例如:
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。其他选项可以在
找到
Stata 杂志(2010 年)
10,第 2 期,第 281-296 页,
Speaking Stata:寻找变量,
通过尼克考克斯。 (在网络上免费提供。)