R 将年-月字符串转换为带间隙的三个月箱子-如何分配连续的升序值?

R 将年-月字符串转换为带间隙的三个月箱子-如何分配连续的升序值?,r,date-formatting,binning,R,Date Formatting,Binning,我使用下面的代码将一年的“bin.month”字符串转换为三个月的bin。问题是,我希望每个箱子都有一个编号,该编号与箱子按时间顺序出现的位置相对应(即,第一个箱子=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

我使用下面的代码将一年的“bin.month”字符串转换为三个月的bin。问题是,我希望每个箱子都有一个编号,该编号与箱子按时间顺序出现的位置相对应(即,第一个箱子=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 
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

如果缺少几个月,那么这将给出与(1)不同的答案,因此这完全取决于您在寻找什么。

谢谢@G.Grothendieck。我应该提到的是,数据集中缺少一些月度观测数据。我想为有观察的月份创建三个月的垃圾箱。。。有时会连续三个月,但有时我只想在接下来的连续三个月里存储数据。我还能用“as.yearqtr”吗?再次感谢@G.Grothendieck。我在原始问题中添加了示例输入和输出。我还尝试使用上面的可能性2,但得到了以下消息:
level中的错误我提供了新的示例数据来解决这个问题。在不应该添加的时候添加了额外的零。输入是year.mo。所需的输出是集群或存储箱编号。我试图给出一个示例来说明我希望输出的外观。对不起,如果不清楚的话。谢谢你的时间和耐心!!我成功了!!这是我的后续问题。格洛森迪克在这里的回答要好得多;我太急于检查
zoo::as.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
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