当无法在浏览器/编辑器中使用drop或find时,如何删除一个存在的值?

时间:2018-12-03 05:02:40

标签: stata

我似乎无法在数据编辑器中的任何地方找到值,而无法获取 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清楚地显示了该值。我不明白为什么我无法在任何地方与价值互动。

1 个答案:

答案 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在这里会告诉您testfloat,这是默认的数字类型。

那就是说,我根本不会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