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