【问题标题】:How to display real dates in a loop in r如何在r中循环显示真实日期
【发布时间】:2020-01-03 01:35:29
【问题描述】:

当我在循环中迭代日期时,R 会打印出日期的数字编码。

例如:

dates <- as.Date(c("1939-06-10", "1932-02-22", "1980-03-13", "1987-03-17",
                    "1988-04-14", "1979-08-28", "1992-07-16", "1989-12-11"), tryFormats = c("%Y-%m-%d"))

for(d in dates){

  print(d)
}

输出如下:

[1] -11163
[1] -13828
[1] 3724
[1] 6284
[1] 6678
[1] 3526
[1] 8232
[1] 7284

如何让 R 打印出实际日期? 所以输出为:

[1] "1939-06-10" 
[1] "1932-02-22" 
[1] "1980-03-13" 
[1] "1987-03-17" 
[1] "1988-04-14" 
[1] "1979-08-28" 
[1] "1992-07-16" 
[1] "1989-12-11"

谢谢!

【问题讨论】:

  • 为什么需要for循环?只需在控制台输入datesprint(dates)
  • 这是我正在处理的更大循环的一部分。堆栈溢出问题已被简化

标签: r loops date


【解决方案1】:

当您在 R 中的 for 循环中将 dates 用作 seq 时,它会丢失其属性。

您可以使用as.vector 剥离属性并亲自查看(或使用dput 来查看完整对象的底层):

as.vector(dates)
# [1] -11163 -13828   3724   6284   6678   3526   8232   7284
dput(dates)
# structure(c(-11163, -13828, 3724, 6284, 6678, 3526, 8232, 7284), class = "Date")

在 R 中,Date 对象只是带有class Datenumeric 向量(class 是一个属性)。

因此您看到的是数字(FWIW,这些数字自 1970-01-01 起算天数)。

要恢复Date属性,可以使用.Date函数:

for (d in dates) print(.Date(d))
# [1] "1939-06-10"
# [1] "1932-02-22"
# [1] "1980-03-13"
# [1] "1987-03-17"
# [1] "1988-04-14"
# [1] "1979-08-28"
# [1] "1992-07-16"
# [1] "1989-12-11"

这等价于as.Date(d, origin = '1970-01-01'),即as.Datenumeric 方法。

有趣的是,*apply 函数不会剥离属性:

invisible(lapply(dates, print))
# [1] "1939-06-10"
# [1] "1932-02-22"
# [1] "1980-03-13"
# [1] "1987-03-17"
# [1] "1988-04-14"
# [1] "1979-08-28"
# [1] "1992-07-16"
# [1] "1989-12-11"

【讨论】:

    【解决方案2】:

    有多种方法可以处理:

    循环日期索引:

    for(d in seq_along(dates)){
       print(dates[d])
    }
    
    #[1] "1939-06-10"
    #[1] "1932-02-22"
    #[1] "1980-03-13"
    #[1] "1987-03-17"
    #[1] "1988-04-14"
    #[1] "1979-08-28"
    #[1] "1992-07-16"
    #[1] "1989-12-11"
    

    或将日期转换为列表,然后直接print

    for(d in as.list(dates)) {
       print(d)
    }
    

    【讨论】:

      猜你喜欢
      • 2020-07-06
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多