我试图通过输入动物园对象来理解我过去的困难。 read.zoo的以下两个用法给出了不同的结果,尽管tz的默认参数应该是“”,这是两个read.zoo调用之间的唯一区别:
Lines <- "2013-11-25 12:41:21 2
2013-11-25 12:41:22.25 2
2013-11-25 12:41:22.75 75
2013-11-25 12:41:24.22 3
2013-11-25 12:41:25.22 1
2013-11-25 12:41:26.22 1"
library(zoo)
z <- read.zoo(text = Lines, index = 1:2)
> dput(z)
structure(c(2L, 2L, 75L, 3L, 1L, 1L), index = structure(c(16034,
16034, 16034, 16034, 16034, 16034), class = "Date"), class = "zoo")
z <- read.zoo(text = Lines, index = 1:2, tz="")
> dput(z)
structure(c(2L, 2L, 75L, 3L, 1L, 1L), index = structure(c(1385412081,
1385412082.25, 1385412082.75, 1385412084.22, 1385412085.22, 1385412086.22
), class = c("POSIXct", "POSIXt"), tzone = ""), class = "zoo")
>
答案 0 :(得分:9)
答案(当然)在read.zoo()
的来源中,其中有:
....
ix <- if (missing(format) || is.null(format)) {
if (missing(tz) || is.null(tz))
processFUN(ix)
else processFUN(ix, tz = tz)
}
else {
if (missing(tz) || is.null(tz))
processFUN(ix, format = format)
else processFUN(ix, format = format, tz = tz)
}
....
即使tz
的默认为""
,在您的第一种情况下,tz
被视为缺失(missing()
),因此{ {1}}被使用。当您设置processFUN(ix)
时,它不再缺失,因此您获得tz = ""
。
如果不查看processFUN(ix, tz = tz)
的详细信息,可以通过在参数中使用read.zoo()
或tz = NULL
(无默认值)然后在代码中更好地处理这个问题,如果{{1}由于某种原因需要设置为tz
,执行:
tz
或者如果要求所有这些都是为了避免混淆两个不同的电话,甚至不需要这个?
答案 1 :(得分:3)
实际上,默认索引类为"Date"
,除非使用tz
,在这种情况下默认值为"POSIXct"
。因此,问题中的第一个示例提供了"Date"
类,因为这是默认值,第二个"POSIXct"
指定了tz
。
如果要在不使用这些默认值的情况下指定类,则要明确使用FUN
参数:
read.zoo(...whatever..., FUN = as.Date)
read.zoo(...whatever..., FUN = as.POSIXct) # might need FUN=paste,FUN2=as.POSIXct
read.zoo(...whatever..., FUN = as.yearmon)
# etc.
FUN
参数也可以采用自定义函数,如包中的示例所示。
请注意,如果未指定格式,则始终采用标准格式(例如"%Y-%m-%d"
类的"Date"
),并且永远不会尝试自动确定格式。
?read.zoo
详细解释了它的工作方式,?read.zoo
中有很多例子(示例部分中有78行代码)以及整个插图(其中一个六个小插曲专门致力于read.zoo
&#34; :Reading Data in zoo。
已添加已展开以上内容。此外,在可用的动物园here的开发版本中,启发式已得到改进,并且通过该改进,问题中的第一个示例确实识别日期/时间并选择POSIXct。此外,还在read.zoo
帮助文件中添加了对简单启发式的一些说明,以便不必依赖提供的许多示例。
以下是一些例子。请注意,引用的启发式是一种启发式方法,仅用于确定时间索引的类。它只能识别"numeric"
,"Date"
和"POSIXct"
类。启发式无法识别其他类(尽管您可以使用FUN=
自行指定它们)。启发式也不识别格式。如果未使用format=
提供格式或通过FUN=
隐式提供格式,则采用标准格式,例如在"%Y-%m-%d"
的情况下"Date"
。
Lines <- "2013-11-25 12:41:21 2
2013-12-25 12:41:22.25 3
2013-12-26 12:41:22.75 8"
# explicit. Uses POSIXct.
z <- read.zoo(text = Lines, index = 1:2, FUN = paste, FUN2 = as.POSIXct)
# tz implies POSIXct
z <- read.zoo(text = Lines, index = 1:2, tz = "")
# heuristic: Date now; devel ver uses POSIXct
z <- read.zoo(text = Lines, index = 1:2)
Lines <- "2013-11-251 2
2013-12-25 3
2013-12-26 8"
z <- read.zoo(text = Lines, FUN = as.Date) # explicit. Uses Date.
z <- read.zoo(text = Lines, format = "%Y-%m-%d") # format & no tz implies Date
z <- read.zoo(text = Lines) # heuristic: Date
注意:
(1)一般而言,使用FUN
或使用tz
和/或format
而不是依赖于启发式,更明确。如果您使用FUN
或使用tz
和/或format
进行半明确表示明确,则read.zoo
的当前版本和开发版本之间不会发生任何变化。< / p>
(2)依靠文档而不是内部更安全,因为内部可以在没有警告的情况下进行更改,实际上在开发版本中已经发生了变化。如果你真的想查看代码,那么如果FUN
没有明确定义,则选择索引类的关键语句是if (is.null(FUN)) ...
源中的read.zoo
语句。
(3)我建议使用read.zoo
更简单,更直接,更紧凑,而不是read.table
后跟zoo
等变通办法。我和其他许多人一样使用read.zoo
多年来对我来说似乎非常可靠但是如果有人发现read.zoo
或文档的特定问题(总是可能的,因为它有很多)他们总能得到报道。尽管包装已经存在多年,但仍在进行改进。
答案 2 :(得分:2)
我怀疑你使用read.zoo
绊倒了你。这是我做的:
library(zoo)
tt <- read.table(text=Lines)
z <- zoo(as.integer(tt[,3]), order.by=as.POSIXct(paste(tt[,1], tt[,2])))
现在z
是一个合适的动物园对象:
R> z
2013-11-25 12:41:21.00 2013-11-25 12:41:22.25 2013-11-25 12:41:22.75
2 2 75
2013-11-25 12:41:24.22 2013-11-25 12:41:25.22 2013-11-25 12:41:26.22
3 1 1
R> class(z)
[1] "zoo"
R> class(index(z))
[1] "POSIXct" "POSIXt"
R>
通过确保我使用POSIXct
对象作为索引,我实际上得到了一个POSIXct
对象。