短篇小说: - 在进行分析时,我忘了考虑日间和星期间的价值观。我需要将它们添加到我的桌子上。
长篇故事: 我有这张桌子:
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
... ...
答案 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)
非常感谢你的帮助。