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,但发现它不起作用,并且使代码比应有的更复杂。
我以前从未使用过
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
参数可以解决该问题。