R:日期向量中的日期是什么:日期或数字值?(x [i]和i之间的差异)

use*_*256 6 r date

谁能解释一下,为什么在第一个循环中我的日期向量的每个元素都是一个日期,而在第二个循环中,我的日期向量的每个元素都是数字?谢谢!

x <- as.Date(c("2018-01-01", "2018-01-02", "2018-01-02", "2018-05-06"))
class(x)
# Loop 1 - each element is a Date:
for (i in seq_along(x)) print(class(x[i]))
# Loop 2 - each element is numeric:
for (i in x) print(class(i))             
Run Code Online (Sandbox Code Playgroud)

Cal*_*You 8

元素是Date,第一个循环是正确的。

不幸的是,R并没有始终具有第二个循环的样式。我认为问题在于for (i in x)语法会绕过Date访问器之类的方法,[因为R中的S3类非常稀薄,并且不会阻止您不使用其预期的接口,所以它可以这样做。这可能会造成混淆,因为类似的东西for (i in 1:4) print(i)直接起作用,因为数值是基本向量类型。Date是S3,因此被强制为数字。要查看第二个循环中正在打印的数字对象,可以运行以下命令:

x <- as.Date(c("2018-01-01", "2018-01-02", "2018-01-02", "2018-05-06"))
for (i in x) print(i)
#> [1] 17532
#> [1] 17533
#> [1] 17533
#> [1] 17657
Run Code Online (Sandbox Code Playgroud)

这为您提供了与Date向量的未分类版本相同的功能。这些数字是自Unix时间开始以来的天数,如果将其转换为Date,也可以在下面看到origin

unclass(x)
#> [1] 17532 17533 17533 17657
as.Date(unclass(x), "1970-01-01")
#> [1] "2018-01-01" "2018-01-02" "2018-01-02" "2018-05-06"
Run Code Online (Sandbox Code Playgroud)

因此,我会像在第一个循环中一样,坚持对所有S3向量类型使用正确的访问器。


DJV*_*DJV 3

当你跑步时:

for (i in seq_along(x)) print(class(x[i]))
Run Code Online (Sandbox Code Playgroud)

i您正在对 的每个元素使用迭代器x。这意味着每次您获得 的每个迭代成员的类x

但是,当您运行时:

for (i in x) print(class(i))
Run Code Online (Sandbox Code Playgroud)

您正在寻找每个成员的类别。使用?Date

日期表示为自 1970-01-01 以来的天数

这就是为什么你把数字作为你的班级的原因。

此外,如果您使用print()for every 循环,您将获得日期和数字:

for (i in seq_along(x)) print(x[i])

[1] "2018-01-01"
[1] "2018-01-02"
[1] "2018-01-02"
[1] "2018-05-06"
Run Code Online (Sandbox Code Playgroud)

for (i in x) print(i)

[1] 17532
[1] 17533
[1] 17533
[1] 17657
Run Code Online (Sandbox Code Playgroud)

最后,如果你想测试 R 的逻辑,我们可以这样做:

x[1] - as.Date("1970-01-01")
Run Code Online (Sandbox Code Playgroud)

取 x 的第一个元素(“2018-01-01”)并减去“1970-01-01”,这是第一个日期。我们的输出将是:

Time difference of 17532 days
Run Code Online (Sandbox Code Playgroud)