Генерация составной переменной даты - PullRequest
0 голосов
/ 07 января 2020

Я хочу сгенерировать переменную month, в которой месяц и год объединены как 2013M01.

Ниже приведен пример моих данных:

clear

input expected_arrival_month year
1 2013
2 2014
3 2015
4 2016
5 2017
6 2018
end

Я попробовал следующая команда:

generate month = .
replace month = 2013M01 if expected_arrival_month == 1 & year == 2013

Однако я получил ошибку:

2013M01 invalid name 
r(198)

Как я могу получить желаемый вывод?

Ответы [ 2 ]

1 голос
/ 08 января 2020

Практически для всех целей Stata числовая переменная даты c лучше, чем любая ручная или самодельная (и, конечно, даты, хранящиеся в виде строковых переменных). Вы можете заставить такие переменные появляться, как вы просите. Вам, конечно, не нужно рассчитывать отдельные значения напрямую. Хотя этот код предназначен для минимального набора данных, он будет применяться ко всем значениям в числовых c переменных, которые вы описываете. См. help datetime для получения бесценной (и неизбежной) информации.

clear
set obs 1 
generate year = 2013 
generate arrival_month = 1 

generate wanted = ym(year, arrival_month)
format wanted %tmCCYY!MNN 

list 

     +---------------------------+
     | year   arriva~h    wanted |
     |---------------------------|
  1. | 2013          1   2013M01 |
     +---------------------------+

(Как прокомментировано, вы должны предоставить пример данных напрямую и таким образом, чтобы прояснить типы переменных. Если одна или обе переменные действительно строковые, сначала примените destring или используйте monthly().)

0 голосов
/ 07 января 2020

Проблема здесь заключается в работе со строковыми, а не числовыми c переменными. Учитывая, что генерируемая вами переменная является строковой переменной, ее содержимое должно быть заключено в кавычки:

generate month = "2013M01" if expected_arrival_month == 1 & year == 2013

. Существуют и другие более эффективные способы работы с этим поколением, например, использование Команда egen Stata (и concat) или datetime работает, как указано в другом ответе.

...