说我有这些数据:
clear
set more off
input ///
str15(s1 s2 s3 s4)
a "b" "b" "c"
b "b" "" "a"
c "c" "" ""
d "f" "" "g"
e "" "" ""
end
我想逐行找到非缺失值的数量。我试试:
gen sum = s1!="" + s2!="" + s3!="" + s4!=""
但这会导致类型不匹配错误。我做错了什么?
但是,我可以把它写出来并且有效:
gen x=s1!=""
gen y=s2!=""
gen z=s3!=""
gen q=s4!=""
gen sum1=x + y + z + q
答案 0 :(得分:4)
问题是运营商优先级。以下作品:
gen sum = (s1!="") + (s2!="") + (s3!="") + (s4!="")
来自Stata用户指南
所有运营商的评估顺序(从头到尾)是! (或〜),^, - (否定),/,*, - (减法),+,!=(或〜=),>,<,< =,> =,==,& ,和|。
但是,我更喜欢Roberto和Dimitry的rownonmiss
推荐。
答案 1 :(得分:2)
我相信你想要这样的东西:
gen sum2 = !missing(s1) + !missing(s2) + !missing(s3) + !missing(s4)
甚至更紧凑的东西:
egen sum3 = rownonmiss(s1 s2 s3 s4), strok
egen
代表扩展生成,通常是开始查找的好地方,如果第一次失败则会egenmore
。
但是,我没有很好的直觉,为什么你的代码失败了字符串。它似乎适用于数字变量。