2015-03-26 3 views
2

Мне был предоставлен файл данных Stata (counts.dta), который содержит ежедневные данные за годы с 1975 по 2006 год, хранящиеся в широкоформатном формате. В столбцах помечен месяц (полное имя месяца в виде символьной строки), день (числовые значения 1-31), а затем годы с 1975 по 2006 год с метками «_1975», «_1976» ... '_2006' , Я предполагаю, что подчеркивание является следствием чего-то в Stata. Есть фиктивные значения нуля (0), вставленные на дату 29 февраля, когда год-столбец не является високосным годом.R. Обработка дат и широкого формата из импортированного файла Stata

Я хочу сделать несколько вещей. Во-первых, конвертируйте в длинную форму с разумным представлением за год. Во-вторых, измените трехстороннее представление даты на нечто более разумное.

Мой подход был изменить символьная строка месяц до множителя, а затем получить его в правильном порядке:

require("foreign") 

counts <- read.dta(file='counts.dta') 
counts[['month']] <- as.factor(counts[['month']]) 
counts[['month']] <- 
    factor(counts[['month']], levels(counts[['month']])[c(5,4,8,1,9,7,6,2,12,11,10,3)]) 

Я тогда

str(counts) 

'data.frame': 366 obs. of 34 variables: 
$ month: Factor w/ 12 levels "January","February",..: 1 1 1 1 1 1 1 1 1 1 ... 
$ day : int 1 2 3 4 5 6 7 8 9 10 ... 
$ _1975: int 515 649 745 599 445 667 725 749 646 740 ... 
$ _1976: int 485 685 529 467 630 723 712 685 715 504 ... 
$ _1977: int 505 437 489 588 634 734 682 537 453 673 ... 

и так далее. Преобразование в длинном формате

lcounts <- reshape(counts, 
    direction="long", 
    varying=list(names(counts)[3:34]), 
    v.names="n.counts", 
    idvar=c("month","day"), 
    timevar="Year", 
    times=1975:2006) 

str(lcounts) 

дает

'data.frame': 11712 obs. of 4 variables: 
$ month : Factor w/ 12 levels "January","February",..: 1 1 1 1 1 1 1 1 1 1 ... 
$ day  : int 1 2 3 4 5 6 7 8 9 10 ... 
$ Year : int 1975 1975 1975 1975 1975 1975 1975 1975 1975 1975 ... 
$ n.counts: int 515 649 745 599 445 667 725 749 646 740 ... 

плюс некоторые дополнительные строки, относящиеся к исходному файлу Stata.

Мои вопросы: (1) то, что теперь является хорошим способом конвертировать в фактор-месяц, числовой год и числовой день в полезный формат даты, чтобы я мог определить, например, день неделя, интервал между двумя датами и так далее? (2) Был ли лучший способ решить проблему с самого начала?

+1

@ExperimenteR У ОП уже есть данные, загруженные в R. Этот совет не помогает решить актуальные вопросы. – Thomas

+1

@Thomas Я поддерживаю такие комментарии, как ExperimeteR, которые могут быть полезны на соседней территории, а именно для проблем, очень похожих, но не совсем похожих на опубликованные. Естественно, что по-прежнему существует решение о том, где провести линию, но ОП задал их (2) для более широкого комментария, что кажется законным, учитывая основной вопрос, дающий конкретные детали. –

ответ

2

Это должно быть довольно просто, потому что все, что вам нужно сделать, - это вставить вместе свои строки данных и использовать as.Date, чтобы создать вектор класса Date.

Давайте начнем с некоторыми данными, подобными вашему:

dat <- data.frame(month = c(rep("January",31), rep("February",29)), 
        day = c(1:31, 1:29), 
        Year = 1975, 
        n.counts = 515) 

Тогда создание переменной даты просто:

dat$Date <- as.Date(with(dat, paste(as.numeric(month), day, Year)), "%m %d %Y") 
str(dat) 
# 'data.frame': 60 obs. of 5 variables: 
# $ month : Factor w/ 2 levels "February","January": 2 2 2 2 2 2 2 2 2 2 ... 
# $ day  : int 1 2 3 4 5 6 7 8 9 10 ... 
# $ Year : num 1975 1975 1975 1975 1975 ... 
# $ n.counts: num 515 515 515 515 515 515 515 515 515 515 ... 
# $ Date : Date, format: "1975-02-01" "1975-02-02" "1975-02-03" "1975-02-04" # ... 
+0

Я вижу; другими словами, создать совершенно новую структуру дат, которая будет использоваться вместе с моими предыдущими знаниями о структуре существующих данных. Очень хорошо. – user02814

+0

Говоря «приятно», на самом деле получается, что я считаю неудобным. Нужно построить 366 повторений каждого года с 1975 по 2006 год, а также делать что-то подобное в дни каждого месяца и имена месяцев. Есть ли на самом деле метод, более простой, чем то, что я поставил в моем вопросе, для (а) достижения того, что я уже достиг, и (б) преобразования информации о датах в формат даты. Я был бы очень рад даже покинуть исходную часть, как я ее понял, и найти простой способ преобразования даты в структуру даты. – user02814

+0

@ user02814 Единственной строкой в ​​приведенном выше вам нужно запустить 'as.Date (...)' другой материал - просто предоставить структуру данных, похожую на вашу, чтобы показать этот метод. Преимущество наличия данных в длинном формате (как у вас уже есть) состоит в том, что вы можете создать вектор типа даты в одной строке кода. Если вы держитесь в широкой структуре, это будет намного сложнее. – Thomas

1

Основное внимание в этой теме, естественно, что делать в R после импорта данных, но здесь я собираю различные детали на стороне Stata этого.

Давно совет, что данные такого рода гораздо проще обрабатывать в Stata в длинной форме, а reshape long - это стандартная команда для преобразования данных, поступающих с данными за каждый год в отдельной переменной (пользователи R: пожалуйста прочитайте «столбец» как перевод). Поэтому, если это возможно, вы должны попросить поставщика таких файлов Stata сделать это перед экспортом.

То, что вызовы OP звонков, такие как _1975, являются именами законных переменных в Stata, и, поскольку OP догадывается, что подчеркивание необходимо, поскольку имена переменных в Stata не могут начинаться с числовых символов.

На основании предоставленной информации было бы возможно экспортировать данные без потерь из Stata в форматах файлов, отличных от .dta, особенно в виде обычных видов текстовых файлов (.csv и т. Д.).Предпочтительный способ

STATA о проведении ежедневных дат как целые числа с началом 0 = 1 январь 1960 (так 26 марта 2015 будет 20173), который предположительно является тривиальным легко преобразовать любую дату представления в R.

В короткая, конкретная и действительно специфическая форма данных, представленных в ОП, ни в коем случае не требуется ни синтаксисом Stata, ни даже рекомендована как часть хорошей практики Stata.

+0

Одна из радостей «открытых данных» не имеет большого контроля над тем, как вы получаете нужные данные! Как оказалось, решение моей проблемы, на мой взгляд, заключается в том, чтобы взять часть предложения от Томаса ... что-то, что я упустил ... и это должно использовать as.Date для создания новой переменной даты внутри мой исходный фрейм данных, используя переменные во многом так же, как предлагает Томас. Но для этого мне (думаю) все равно нужно преобразовать месяцы в коэффициент, чтобы получить числовое значение – user02814

+0

Извините. но я не могу помочь синтаксису R, который вам нужен, если он все еще открыт. Моя предпосылка заключается в том, что нить должна в идеале обладать некоторой ценностью сверх определенной проблемы, возникающей внутри нее, поэтому мои замечания более широко распространены и относятся только к стороне Stata. –

+0

Я согласен и, конечно же, не намерен уменьшать предложение, сделанное вами относительно экспорта из Stata. Фактически, я принял ваши комментарии еще более широко, чтобы предположить, что нужно практиковать хорошую обработку данных в любом пакете, который вы используете, и если вы перемещаете данные из одного пакета в другой, имеет смысл использовать возможности платформу на стороне экспорта, чтобы упростить весь процесс. – user02814

Смежные вопросы