2015-11-09 8 views
2

Я использовал приведенный ниже код для «bin» year.month string в трехмесячные бункеры. Проблема в том, что я хочу, чтобы каждый из ячеек имел число, соответствующее тому, где бит происходит хронологически (т. Е. Первый бит = 1, второй бит = 2 и т. Д.). Прямо сейчас, первый месяц bin присваивается номеру 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 

UPDATE:

меня попросили обеспечить ввод образца (год) и желаемый результат (Cluster.GN) .I имеют год-месяц строка, которая имеет изменяющееся число наблюдений для каждого месяца, и некоторые месяцы не имеют никаких наблюдений. То, что я хочу сделать, это bin каждый из трех последовательных месяцев, у которых есть данные, присваивая каждому трехмесячному «бин» номер, как показано ниже.

 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 
+1

Это следующий вопрос, чтобы [Преобразовать столбцы строки года в квартальные кварталы] (http://stackoverflow.com/questions/33597728/convert-year-month-string-column-into-quarterly-bins/33601714). Ответ G Grothendieck здесь намного лучше; Я слишком спешил, чтобы проверить 'zoo :: as.yearqtr()' – smci

ответ

3

1) Преобразование строки в "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), так что все зависит от того, что вы ищете ,

+1

Спасибо @G. Гротендик. Что-то, о чем я должен был упомянуть, состоит в том, что некоторые из ежемесячных наблюдений отсутствуют в наборе данных. Я хочу создать трехмесячные бункеры в течение месяцев, где были наблюдения ... Иногда бывает три месяца подряд, но в других случаях я просто хочу просунуть следующие три месяца подряд, для которых у меня есть данные. Могу ли я использовать «as.yearqtr» для этого? –

+0

Еще раз спасибо @G. Гротендик. Я добавил образец ввода и вывода в исходный вопрос. Я также попытался использовать возможность 2 выше, но получил следующее сообщение: Ошибка в 'levels <-. Factor' (' * tmp * ', value = integer (0)): Число уровней различается –

+0

Я представил новые образцы данных решить проблему. Добавочные нули были добавлены, когда они не должны были быть. –

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

  • Нет связанных вопросов^_^