首页 > 解决方案 > lubridate :: interval() 在 for 循环中返回一次数值

问题描述

我有上周工作的代码,本周不工作。我正在使用lubridate::interval(),它对于 a 之外的以下数据非常有效for loop,但是一旦我将它放在 a 中for loop,它就会返回数值而不是间隔。

# sample code
    sunset <- as.POSIXct(c("2019-11-05 19:12:17", "2019-11-06 19:13:04", "2019-11-07 19:13:51"), 
                     tz = "Pacific/Norfolk") 

sunrise <- as.POSIXct(c("2019-11-06 05:53:04", "2019-11-07 05:52:23", "2019-11-08 05:51:43"), 
                      tz = "Pacific/Norfolk")
# sample data frame

ds <- data.frame( "sunset" = sunset, 
                 "sunrise" = sunrise)

interval(start = ds$sunset[1],  # check the interval function is working
         end = ds$sunrise[1])

返回:

[1] 2019-11-05 19:12:17 +12--2019-11-06 05:53:04 +12

但在 for 循环内:

for (i in seq_along(ds$sunset)) {
  
  ds$interval[i] <- interval(start = ds$sunset[i],
                                   end = ds$sunrise[i])
}

它返回:

> ds
               sunset             sunrise interval
1 2019-11-05 19:12:17 2019-11-06 05:53:04    38447
2 2019-11-06 19:13:04 2019-11-07 05:52:23    38359
3 2019-11-07 19:13:51 2019-11-08 05:51:43    38272

我已经尝试将interval()部分包装进去,as.interval()但它只是再次返回了数值。我很感激这方面的任何帮助。谢谢 :)

标签: rfor-looplubridate

解决方案


您遇到的问题是您需要预先初始化dsas class的列interval

library(lubridate)

ds$interval <- rep(interval(as.POSIXct(NA,tz = "Pacific/Norfolk"),
                   as.POSIXct(NA,tz = "Pacific/Norfolk")),
                   3)

for (i in seq_along(ds$sunset)) {  
  ds$interval[i] <- interval(start = ds$sunset[i],
                                   end = ds$sunrise[i])
}
ds
#               sunset             sunrise                                         interval
#1 2019-11-05 19:12:17 2019-11-06 05:53:04 2019-11-05 07:12:17 UTC--2019-11-05 17:53:04 UTC
#2 2019-11-06 19:13:04 2019-11-07 05:52:23 2019-11-06 07:13:04 UTC--2019-11-06 17:52:23 UTC
#3 2019-11-07 19:13:51 2019-11-08 05:51:43 2019-11-07 07:13:51 UTC--2019-11-07 17:51:43 UTC

推荐阅读