【问题标题】:Convert year-month string to three month bins with gaps - how to assign contiguous ascending values?将年月字符串转换为有间隙的三个月箱 - 如何分配连续的升值?
【发布时间】:2015-11-09 16:36:41
【问题描述】:

我使用下面的代码将 year.month 字符串“bin”到三个月的 bin 中。问题是我希望每个 bin 都有一个与 bin 按时间顺序出现的位置相对应的数字(即第一个 bin = 1,第二个 bin = 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 

更新:

我被要求提供样本输入(年份)和所需的输出(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

【问题讨论】:

标签: r date-formatting binning


【解决方案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) 不同的答案,因此这完全取决于您要查找的内容。

【讨论】:

  • 谢谢@G。格洛腾迪克。我应该提到的是,数据集中缺少一些每月的观察结果。我想为有观察的月份创建三个月的分箱......有时会连续三个月,但有时我只想分箱接下来的连续三个月我有数据。我还能为此使用“as.yearqtr”吗?
  • 再次感谢@G。格洛腾迪克。我在原始问题中添加了示例输入和输出。我也尝试使用上面的可能性 2,但收到以下消息:levels&lt;-.factor(*tmp*, value = integer(0)) 中的错误:级别数不同
  • 我提供了新的示例数据来解决问题。在不应该添加的时候添加了额外的零。
  • 输入是year.mo。所需的输出是簇或箱号。我试图举一个例子来展示我希望输出的样子。抱歉,如果不清楚。
  • 感谢您的时间和耐心!!我让它工作了!
猜你喜欢
  • 2020-12-14
  • 2021-06-08
  • 2016-03-14
  • 1970-01-01
  • 2021-04-12
  • 2011-01-15
  • 2021-07-31
  • 2021-07-05
  • 1970-01-01
相关资源
最近更新 更多