我似乎无法在数据编辑器中的任何地方找到值,而无法获取
drop if datecode == 201209.1
即可工作。
我想摆脱这一观点,因为它包含了不合适的日期。数据格式为YYYYMM,表示在2010年9月,2011年,2012年,2013年和2014年9月收集了数据。
. tabulate datecode
DATECODE | Freq. Percent Cum.
------------+-----------------------------------
201009 | 2,113,210 20.19 20.19
201109 | 2,130,289 20.35 40.54
201209 | 2,110,220 20.16 60.70
201209.1 | 1 0.00 60.70
201309 | 2,067,262 19.75 80.46
201409 | 2,045,706 19.54 100.00
------------+-----------------------------------
Total | 10,466,688 100.00
. drop if datecode == 201209.1
(0 observations deleted)
为便于确定原因/解决方案,我将variable descriptive information here包括在内。
我很想了解为什么它不起作用。
似乎tabulate
清楚地显示了该值。我不明白为什么我无法在任何地方与价值互动。
答案 0 :(得分:3)
用十进制分数测试精确相等性比您想像的要困难得多,因为大多数没有精确的二进制等价物。 search precision
在Stata中查找文档中的许多讨论(手册,常见问题解答,Stata博客)。
此对话框显示了比使用round()
更好的方法,即float()
函数。当将值读入或放置在float
变量
. clear
. set obs 1
number of observations (_N) was 0, now 1
. gen test = 201209.1
. list
+----------+
| test |
|----------|
1. | 201209.1 |
+----------+
. list if test == 201209.1
. list if test == float(201209.1)
+----------+
| test |
|----------|
1. | 201209.1 |
+----------+
describe test
在这里会告诉您test
是float
,这是默认的数字类型。
那就是说,我根本不会drop
观察到这一点。似乎是201209的变体。所以,我去
replace datecode = round(datecode, 1)
带有第二个整数参数的 round()
很有用。当用户不了解Stata不一定正在使用二进制近似值时,带有小数第二个参数的round()
的结果通常令人困惑。
This paper详细讨论了如何处理格式为201009的每月日期,这对于Stata来说根本不是标准。简而言之,
gen year = floor(datecode/100)
gen month = mod(datecode, 100)
gen mdate = ym(year, month)
format mdate %tm
解决了大多数问题,但请阅读help datetime
。
所有所说的(!):您的问题仍然令人困惑,因为您的额外描述性信息显示该变量为double
,而不是float
。使用double
,您的比较应该可以进行:
. clear
. set obs 1
number of observations (_N) was 0, now 1
. gen double datecode = 201209.1
. list if datecode == 201209.1
+----------+
| datecode |
|----------|
1. | 201209.1 |
+----------+
还有其他事情吗?您是否先将数据导入为float
,然后再导入recast double
?