谁能解释一下,为什么在第一个循环中我的日期向量的每个元素都是一个日期,而在第二个循环中,我的日期向量的每个元素都是数字?谢谢!
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)
元素是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向量类型使用正确的访问器。
当你跑步时:
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)