从 R 中的yearmon 变量中过滤出日期范围

问题描述 投票:0回答:1

yearmon
包中的
zoo
类似乎对于处理只有年份和月份但没有日期或时间的数据特别有用。然而,我发现它很难使用,特别是在尝试过滤掉一系列日期时。

yearmon
是一种奇怪的数据类。它显示日期如
Jun 2002
。这在美观上更令人愉悦,但是(如果我错了,请纠正我)下面是年份和月份的一部分,一月是
0
,十二月是
11
。因此,例如,
Jun 2002
实际上是
2002.417
(即 5/12)。

现在假设您有十年期间(2000-2009)的每月数据,有点像这样。

       date  value
   <yearmon> <dbl>
 1 Jan 2000  10000
 2 Feb 2000  30000
 3 Mar 2000    250
 4 Apr 2000     20
 5 May 2000  50000
 6 Jun 2000 -90042
 7 Jul 2000  73400
 8 Aug 2000   4317
 9 Sep 2000   1000
10 Oct 2000    -22

您想要过滤掉 2002 年 6 月到 2003 年 11 月之间的行。

%in%
适合仅保留特定范围的值,但我经常发现取此函数的逆函数同样有用,如下所示。

%!in% <- Negate(%in%)

我的理解是,您无法使用

yearmon
显示的内容。意思是,您实际上无法引用像
"Jun 2003"
这样的日期,而是需要使用存储在引擎盖下的内容(即
2002.417
)。我认为使用
filter()
中的
dplyr
来过滤掉日期范围就足够了,如下所示

my_data |>
  filter(date %!in% c(2002.417:2003.833))

但是,我发现这似乎不起作用,因为从2002年6月到2003年11月的月份不会被删除。我认为这可能与结肠不与

yearmon
工作有关?我尝试仅删除 2002 年 6 月(即删除冒号和 2003.833),并且能够删除该单个日期。但是,我发现当您尝试指定要删除的日期范围时它不喜欢它。如果日期是数字,例如写为
200206
200311
,我发现运行上面的代码可以删除该句点。

有谁知道如何过滤掉课堂上的一系列日期

yearmon
?令我惊讶的是,似乎没有太多关于过滤日期范围的内容(通常我发现在线教程仅展示如何保留特定范围,而不是排除)。

另外,因为我也没有看到太多讨论,人们对

yearmon
zoo
课程有什么想法?你觉得有用吗?许多教程似乎只使用
yearmon
将月份或年份提取到单独的列中。我在课堂上只记录月份和年份是错误的吗
yearmon
?是否最好将它们存储为类
date
并在当天结束时添加
01
,这样就像
2002-06-01
一样?

我尝试使用 !=,而不是 %!in%。我还尝试输入 c("Jun 2002": "Nov 2003") 但收到 NA/NAN 错误消息。我也尝试将其转换为

date
类并使用 c("2002-06-01:"2003-11-01") 但我认为我也遇到了 NA/NAN 错误,即使在删除引号之后也是如此并将连字符替换为斜杠 c("2002/06/01:"2003/11/01")。我还尝试删除连接符号和括号,以防数字日期值足够,但这也不起作用。我还尝试使用
between()
函数的 Negate,但发现它不起作用,并且使代码比应有的更复杂。

date range filtering zoo
1个回答
0
投票

我以前从未使用过

yearmon
,但我相信您的错误源于使用
:
。使用像
2000:2003
这样的冒号将产生从 2000 到 2003 的整数值。 使用非整数值会增加 1,直到超过终点。这不会在您的情况下产生所需的匹配。

c(2002.417:2003.833)
[1] 2002.417 2003.417

您要找的功能是

seq()

 x <- seq(from = 2002.417, to = 2003.833, by = 1/12)
 x
 [1] 2002.417 2002.500 2002.584 2002.667 2002.750 2002.834 2002.917 2003.000 2003.084
[10] 2003.167 2003.250 2003.334 2003.417 2003.500 2003.584 2003.667 2003.750

 as.yearmon(x)
 [1] "Jun 2002" "Jul 2002" "Aug 2002" "Sep 2002" "Oct 2002" "Nov 2002" "Dec 2002"
 [8] "Jan 2003" "Feb 2003" "Mar 2003" "Apr 2003" "May 2003" "Jun 2003" "Jul 2003"
[15] "Aug 2003" "Sep 2003" "Oct 2003"

您会注意到缺少

Nov 2003
(或
2003+((11-1)/12) = 2003.834
)。这是因为
seq()
不能超过
to
参数。少量增加
to
参数可以解决该问题。

© www.soinside.com 2019 - 2024. All rights reserved.