2016-12-07 2 views
-1

У меня есть набор дат сроком на 10 лет, начиная с апреля 2006 года по август 2016 года, т.е. 125 месяцев. Я хочу идентифицировать каждый месяц, маркируя их последовательной нумерацией, начиная с «1» до «125» в соответствующем столбце (новый столбец). Пример: Все даты в апреле2006 года будут обозначены как 1 ... май'2006 как 2 ...... август2016 как 125.Последовательная нумерация для каждого месяца по периоду времени в R

Даты в наборе данных в формате.

Запрос руководства о том, как этого достичь.

+0

"формат"? Вы имеете в виду, что они относятся к классу 'Date'? Или что-то другое? – Gregor

+0

, если ваши данные упорядочены, как вы уже упоминали, добавьте новый столбец в ваш набор данных, используя 'seq (1,125)' – theArun

+0

Дата в типе фактора. – kbsudhir

ответ

0

Использование lubridate для форматирования даты:

library(lubridate) 

# Create a data frame from the string below, as a factor variable 
dat <- '8/7/2006 12/13/2006 12/14/2006 12/15/2006 12/16/2006 8/28/2007 8/29/2007 4/22/2008 4/23/2008 4/24/2008 4/25/2008 4/28/2008 4/29/2008 4/30/2008 5/1/2008 5/2/2008 5/7/2016 5/7/2016 5/7/2016 5/7/2016 6/26/2016 7/4/2016 7/31/2016 8/28/2016' 
test_df <- data.frame(original=as.factor(strsplit(dat, ' ')[[1]])) 

# We will need to convert the dates to strings in the right format 
test_df$converted_string <- as.character(floor_date(mdy(test_df$original), unit="month")) 

# Create a lookup table 
my_months <- seq(125) 
names(my_months) <- seq(as.Date('2006-04-01'), by='month', length.out=125) 

# Do the lookup 
test_df$converted_int <- my_months[test_df$converted_string] 
+0

извините за отсутствие примера набора данных. Ниже приведен образец данных.8/7/2006 12/13/2006 12/14/2006 12/15/2006 12/16/2006 /28/2007 /29/2007 4/22/2008 4/23/2008 4/24/2008 4/25/2008 4/28/2008 4/29/2008 4/30/2008 5/1/2008 5/2/2008 5/7/2016 5/7/2016 5/7/2016 5/7/2016 6/26/2016 7/4/2016 7/31/2016 /28/2016, это фактор типа – kbsudhir

+0

Я все еще понимаю stackoverflow, поэтому прошу прощения за набор данных не в надлежащем формате – kbsudhir

+0

См. Выше; Я поставил промежуточный шаг как отдельный столбец в data.frame для ясности – mpjdem

0

Предположим, что вы начинаете с вектором дат в формате фактора:

x<- as.factor(c("8/7/2006", "12/13/2006", "12/14/2006")) 

Сначала вы должны преобразовать этот вектор в формате Date. В вашем случае это может быть сделано как этот

x<- as.Date(x, format= "%m/%d/%Y") 

Использование команды форматирования вы можете удалить день определенной даты:

format(x, "%Y %m") 
> "2006 08" "2006 12" "2006 12" 

Таким образом, вы избавитесь от дня и просто держать год и месяц. Далее определяют опорный вектор, который содержит все месяцы с апреля 2006 года по август 2016 года:

ref<- seq(from= as.Date("04/01/2006", format= "%m/%d/%Y"), to= as.Date("08/01/2016", format= "%m/%d/%Y"), length.out = 125) 
ref<- format(ref, "%Y %m"). 

Наконец вы сравните записи из х с элементами из исх. Это можно сделать с помощью функции sapply, которая в основном применяет функцию к каждому компоненту x. Здесь функция это применяется функция:

myfun<-function(z) { 
    which(ref == format(z, "%Y %m")) 
} 

Но так как вы не нужны функции myfun в другом месте вы можете напрямую подключить его к sapply Funtion. В конце вы используете команду unlist, поэтому вы получаете вектор.

sapply(x, function(z) which(ref == format(z, "%Y %m"))) 
> 6 10 10 

следует сделать трюк.

+0

Используя формат
(as.Date (Raw_Data $ PROCESS_DATE, format = "% m /% d /% y"), "% Y% b")
Но я получаю 2020 Апр .... 2020 Декабрь. Кажется, он занимает весь год как «2020», но месяц идет совершенно безупречно. Henc e не смог продолжить дальше. Также, пожалуйста, дайте мне знать, что в (z) в функции (z).
Данные, если формат факторов, следовательно, изменил его на Date. – kbsudhir

+0

Я могу понять (z), но неправильный год - проблема :( – kbsudhir

+0

- это ваш вектор даты в формате даты? Вы можете проверить с помощью класса (x). – Cettt