在特定时间戳之后添加行

时间:2017-04-07 10:22:13

标签: r dplyr lubridate

短篇小说: - 在进行分析时,我忘了考虑日间和星期间的价值观。我需要将它们添加到我的桌子上。

长篇故事: 我有这张桌子:

library(tidyverse)
library(lubridate)
df<-structure(list(time = structure(c(1488987000, 1488988800, 1488990600, 
                                      1488992400, 1488994200, 1488996000, 1488997800, 1488999600, 1489001400, 
                                      1489003200, 1489005000, 1489006800, 1489069800, 1489071600, 1489073400, 
                                      1489075200, 1489077000, 1489078800, 1489080600, 1489082400, 1489084200, 
                                      1489086000, 1489087800, 1489089600, 1489091400, 1489093200, 1489156200, 
                                      1489158000, 1489159800, 1489161600, 1489163400, 1489165200, 1489167000, 
                                      1489168800, 1489170600, 1489172400, 1489174200, 1489176000, 1489177800, 
                                      1489179600, 1489411800, 1489413600, 1489415400, 1489417200, 1489419000
), class = c("POSIXct", "POSIXt"), tzone = structure("America/New_York", .Names = "TZ")), 
low.yields = c(0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 
               0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
               0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0)), .Names = c("time", 
                                                                "low.yields"), row.names = c(NA, -45L), class = c("tbl_df", "tbl", 
                                                                                                                  "data.frame"))

有两列,时间戳和虚拟变量。

我想添加并复制时间戳为16:00的可见小时的所有行,并将时间戳更改为9:00,但与下一行的日期相同。请注意,这不一定是第二天,但也可能是在周末。

到目前为止,我找到了函数tibble::add_row,但是我不确定如何复制特定的行。但是,如果我这样做

df %>% add_row(.after = which(hour(df$time) == 16)) 

我只获得第一个值的空行,而不是全部。

此时,表格如下:

   time                 low.yields
   ...                  ...
26 2017-03-09 16:00:00  1
27 2017-03-10 09:30:00  0
   ...                  ...
之后,我想让它看起来像这样。时间比下面的行小半小时,而low.yields值从上面的行继承。这将在有时间16:00的每一行完成。

   time                 low.yields
   ...                  ...
26 2017-03-09 16:00:00  1
27 2017-03-10 09:00:00  1
28 2017-03-10 09:30:00  0
   ...                  ...

1 个答案:

答案 0 :(得分:0)

所以在@akrun的大力帮助下,我找到了解决问题的方法。

df %>%
    filter(hour(time)==16) %>%
    mutate(time = as.POSIXct(paste(as.Date(time), "09:00:00"), tz = "America/New_York") ) %>% 
    mutate(time = time + days(ifelse(wday(time) == 6, 3, 1))) %>%
    bind_rows(df, .) %>% 
    arrange(time) 

非常感谢你的帮助。