How to display real dates in a loop in r

ぐ巨炮叔叔 提交于 2020-05-30 08:42:07

问题


When I iterate over dates in a loop, R prints out the numeric coding of the dates.

For example:

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)
}

The output is as follows:

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

How do I get R to print out the actual dates? So the output reads:

[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"

Thank you!


回答1:


When you use dates as seq in a for loop in R, it loses its attributes.

You can use as.vector to strip attributes and see for yourself (or dput to see under the hood on the full object):

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")

In R, Date objects are just numeric vectors with class Date (class is an attribute).

Hence you're seeing numbers (FWIW, these numbers count days since 1970-01-01).

To restore the Date attribute, you can use the .Date function:

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"

This is equivalent to as.Date(d, origin = '1970-01-01'), the numeric method for as.Date.

Funnily enough, *apply functions don't strip attributes:

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:


There are multiple way you can handle this :

Loop over index of dates :

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"

Or convert date to list and then print directly.

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


来源:https://stackoverflow.com/questions/59572195/how-to-display-real-dates-in-a-loop-in-r

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!