【问题标题】:extend dates of a data.frames in R?在 R 中延长 data.frames 的日期?
【发布时间】:2020-08-22 00:58:28
【问题描述】:

我想extendDF1Datetime 直到End_date,变量x 的最后一个值被重复直到End_date。任何建议将不胜感激。

library(lubridate)

set.seed(123)

DF1 <- data.frame(Datetime = seq(ymd_hms("2011-01-01 00:00:00"), to= ymd_hms("2011-01-10 00:00:00"), by = "hour"),
                X = runif(217, 5,10))

End_date <- "2011-01-15 00:00:00"

【问题讨论】:

  • (1) 提供样本输出将非常有帮助。 (2)我建议一个小的reprex不需要超过2000行的随机数据,你能试着让它更小吗?它可能会使“预期输出”更容易表示。
  • 谢谢@r2evans - 我给了它更多想法并修改了我的问题。

标签: r datetime tidyverse lubridate extends


【解决方案1】:

您可以将completefill 一起使用:

library(tidyr)
DF1 %>%
   complete(Datetime = seq(min(Datetime), as.POSIXct(End_date), 'hour')) %>%
   fill(X)

或者只使用complete,我们可以在fill中传递DF1$X的最后一个值。

DF1 %>%
  complete(Datetime = seq(min(Datetime), as.POSIXct(End_date), 'hour'), 
           fill = list(X = DF1$X[nrow(DF1)]))

【讨论】:

  • 我认为更多地解决了数据表明他们需要的东西,很好。
【解决方案2】:

示例数据,只需几行即可演示:

set.seed(123)
DF1 <- data.frame(
  Datetime = seq(as.POSIXct("2011-01-01 00:00:00"), to = as.POSIXct("2011-01-01 03:00:00"), by = "hour"),
  X = runif(4, 5, 10)
)
End_date <- as.POSIXct("2011-01-01 07:00:00")
DF1
#              Datetime        X
# 1 2011-01-01 00:00:00 6.437888
# 2 2011-01-01 01:00:00 8.941526
# 3 2011-01-01 02:00:00 7.044885
# 4 2011-01-01 03:00:00 9.415087

附加框架只是对data.frame/seq 的另一个调用,使用来自DF1 的最后一个值:

DF1aug <- data.frame(
  Datetime = seq(from = DF1$Datetime[nrow(DF1)], to = End_date, by="hour")[-1],
  X = DF1$X[nrow(DF1)]
)
DF1aug
#              Datetime        X
# 1 2011-01-01 04:00:00 9.415087
# 2 2011-01-01 05:00:00 9.415087
# 3 2011-01-01 06:00:00 9.415087
# 4 2011-01-01 07:00:00 9.415087

这可以通过rbind 轻松扩充到第一个:

rbind(DF1, DF1aug) 
#              Datetime        X
# 1 2011-01-01 00:00:00 6.437888
# 2 2011-01-01 01:00:00 8.941526
# 3 2011-01-01 02:00:00 7.044885
# 4 2011-01-01 03:00:00 9.415087
# 5 2011-01-01 04:00:00 9.415087
# 6 2011-01-01 05:00:00 9.415087
# 7 2011-01-01 06:00:00 9.415087
# 8 2011-01-01 07:00:00 9.415087

如果您使用的是 tidyverse,那么所有这些都带有:

library(dplyr)
DF1 %>%
  slice(n()) %>%
  do(data.frame(
    Datetime = seq(from = .$Datetime, to = End_date, by="hour")[-1],
    X = .$X
  )) %>%
  bind_rows(DF1, .)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 2021-03-08
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    相关资源
    最近更新 更多