添加行

问题描述:

短篇小说: - 虽然做我的分析,我忘了考虑日间和周间的值。我需要将它们添加到我的表格中。添加行

长的故事: 我有这个表:

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

您只指定了'.after',但值是什么? – akrun

+0

嗨,对不起,我补充说明。此时我并不关心这些值,因为我无法确定正确的行。感谢您的关注。 – johnnyheineken

所以在@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) 

非常感谢您的帮助。