Как мне удалить значение, которое существует, когда невозможно использовать функцию удаления или поиска с помощью браузера / редактора? - PullRequest
0 голосов
/ 03 декабря 2018

Я не могу найти значение где-либо в редакторе данных, и мне не удалось заставить drop if datecode == 201209.1 работать.

Я бы хотел избавиться от этого одного замечания, потому что оно содержит неподходящую дату.Формат данных - ГГГГММ - указывает на сбор данных в сентябре 2010, 2011, 2012, 2013 и 2014 годах.

. 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)

Я включил сюда описательную информацию переменной вслучай, который помогает определить причину / решение.

Мне бы очень хотелось понять, почему это не работает.

Кажется, что tabulate ясно показывает значение.Я не понимаю, почему я нигде не могу взаимодействовать со значением.

1 Ответ

0 голосов
/ 03 декабря 2018

Проверка на точное равенство с десятичными дробями сложнее, чем вы думаете, потому что большинство из них не имеют точных двоичных эквивалентов.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() с целым вторым аргументом.Результаты с round() с дробным вторым аргументом часто озадачивают, когда пользователи не понимают, что Stata обязательно работает с двоичными приближениями.

В этом документе подробно обсуждается обработка месячных дат в таких форматах, как 201009, что вообще не является стандартом для Stata.В двух словах,

gen year = floor(datecode/100)
gen month = mod(datecode, 100) 
gen mdate = ym(year, month) 
format mdate %tm 

решает большинство проблем, но читайте help datetime.

Все это говорит (!): Ваш вопрос все еще озадачивает, поскольку ваша дополнительная описательная информация показывает, что переменная double, а не floatdouble ваше сравнение должно работать:

. 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?

...