Преобразовать строку год-месяц в трехмесячные интервалы с пробелами - как назначить непрерывные возрастающие значения?

Я использовал приведенный ниже код, чтобы разделить строку год. месяц на трехмесячные. Проблема в том, что я хочу, чтобы у каждого из ящиков был номер, соответствующий тому, где он находится в хронологическом порядке (т.е. первый ящик = 1, второй ящик = 2 и т. Д.). Прямо сейчас корзине первого месяца присвоен номер 4, и я не уверен, почему. Любая помощь будет высоко ценится!

> head(Master.feed.parts.gn$yr.mo, n=20)
 [1] "2007.10" "2007.10" "2007.10" "2007.11" "2007.11" "2007.11" "2007.11" "2007.12" "2008.01"
[10] "2008.01" "2008.01" "2008.01" "2008.01" "2008.02" "2008.03" "2008.03" "2008.03" "2008.04"
[19] "2008.04" "2008.04"
> 
> yearmonth_to_integer <- function(xx) {
+   yy_mm <- as.integer(unlist(strsplit(xx, '.', fixed=T)))
+   return( (yy_mm[1] - 2006) + (yy_mm[2] %/% 3) )
+ }
> 
> Cluster.GN <- sapply(Master.feed.parts.gn$yr.mo, yearmonth_to_integer)
> Cluster.GN
2007.10 2007.10 2007.10 2007.11 2007.11 2007.11 2007.11 2007.12 2008.01 2008.01 2008.01 
      4       4       4       4       4       4       4       5       2       2       2 
2008.01 2008.01 2008.02 2008.03 2008.03 2008.03 2008.04 2008.04 2008.04 2008.04 2008.05 
      2       2       2       3       3       3       3       3       3       3       3 
2008.05 2008.05 2008.06 2008.10 2008.11 2008.11 2008.12    <NA> 2009.05 2009.05 2009.05 
      3       3       4       5       5       5       6      NA       4       4       4 
2009.06 2009.07 2009.07 2009.07 2009.09 2009.10 2009.11 2010.01 2010.02 2010.02 2010.02 
      5       5       5       5       6       6       6       4       4       4       4 

ОБНОВИТЬ:

Меня попросили предоставить образец ввода (год) и желаемый результат (Cluster.GN). У меня есть строка год-месяц, в которой есть разное количество наблюдений для каждого месяца, а в некоторые месяцы нет никаких наблюдений. Что я хочу сделать, так это объединить каждый из трех последовательных месяцев, по которым есть данные, присвоив каждой трехмесячной "корзине" номер, как показано ниже.

      yr.mo     Cluster.GN
1  2007.10              1
2  2007.10              1
3  2007.10              1
4  2007.10              1
5  2007.10              1
6  2007.11              1
7  2007.11              1
8  2007.11              1
9  2007.11              1
10 2007.12              1
11 2007.12              1
12 2007.12              1
13 2007.12              1
14 2008.10              2
15 2008.10              2
16 2008.10              2
17 2008.10              2
18 2008.12              2
19 2008.12              2
20 2008.12              2
21 2008.12              2
22 2008.12              2

person Dena C    schedule 09.11.2015    source источник
comment
Это следующий вопрос к Конвертировать столбец строки год-месяц в квартальные корзины. Ответ Гротендика здесь намного лучше; Я слишком торопился проверить zoo::as.yearqtr()   -  person smci    schedule 10.11.2015


Ответы (1)


1) Преобразуйте строки в класс zoo "yearqtr", а затем в целые числа:

s <- c("2007.10", "2007.10", "2007.10", "2007.11", "2007.11", "2007.11", 
"2007.11", "2007.12", "2008.01", "2008.01", "2008.01", "2008.01", 
"2008.01", "2008.02", "2008.03", "2008.03", "2008.03", "2008.04", 
"2008.04", "2008.04")

library(zoo)
yq <- as.yearqtr(s, "%Y.%m")
as.numeric(factor(yq))
## [1] 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 3 3 3

Последняя строка может быть альтернативной: 4*(yq - yq[1])+1

Обратите внимание, что в вопросе 2007.12 классифицируется как другой квартал, чем 2007.10 и 2007.11; однако все они находятся в одном квартале, и мы предполагаем, что вы этого не планировали.

2) Другая возможность в зависимости от того, что вы хотите:

f <- factor(s)
nlev <- nlevels(f)
levels(f) <- gl(nlev, 3, nlev)
f
## [1] 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 3 3 3
## Levels: 1 2 3

ЕСЛИ отсутствуют месяцы, тогда это даст другой ответ, чем (1), поэтому все зависит от того, что вы ищете.

person G. Grothendieck    schedule 09.11.2015
comment
Спасибо @G. Гротендик. Я должен был упомянуть, что некоторые ежемесячные наблюдения отсутствуют в наборе данных. Я хочу создать трехмесячные интервалы для месяцев, в которых были наблюдения ... Иногда будут три месяца подряд, но в других случаях я просто хочу объединить следующие три месяца подряд, для которых у меня есть данные. Могу ли я использовать для этого as.yearqtr? - person Dena C; 09.11.2015
comment
Еще раз спасибо @G. Гротендик. Я добавил образец ввода и вывода в исходный вопрос. Я также попытался использовать возможность 2 выше, но получил следующее сообщение: Ошибка в _1 _ (_ 2_, value = integer (0)): количество уровней различается. - person Dena C; 09.11.2015
comment
Я предоставил новые образцы данных, чтобы исправить проблему. Были добавлены лишние нули, хотя их не должно было быть. - person Dena C; 09.11.2015
comment
Входными данными является год.мо. Желаемый результат - это номер кластера или бункера. Я попытался привести пример, чтобы показать, как я хочу, чтобы результат выглядел. Извините, если это было непонятно. - person Dena C; 09.11.2015
comment
спасибо за ваше время и терпение !! У меня все заработало !! - person Dena C; 09.11.2015