Как добавить строку, которая зависит от последней строки, используя dpylr и lubridate? - PullRequest
0 голосов
/ 09 сентября 2018

Данные цены открытия / закрытия минут. Открытие следующей минуты всегда равно закрытию предыдущей минуты. Примерный набор данных:

dt                   open  close
1998-01-02 09:30:00  100   101
1998-01-02 09:31:00  101   102
...
1998-01-02 15:59:00  105   106

После последней строки я хочу добавить еще одну строку, например:

dt                   open  close
1998-01-02 09:30:00  100   101
1998-01-02 09:31:00  101   102
...
1998-01-02 15:59:00  105   106
1998-01-02 16:00:00  106   NA

То есть отметка времени увеличивается на одну минуту, открытие равно закрытию предыдущей минуты, а закрытие равно NA. Мой наивный подход не работает:

library(lubridate)
library(dplyr)

data <- add_row(data, dt = max("dt") + minute(1), open = close[[n()]])

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

Мы могли бы также использовать bind_rows

library(tidyverse)
data %>% 
  summarise(dt = max(dt) + minutes(1), open = last(close)) %>% 
  bind_rows(data, .)
# A tibble: 4 x 3
#  dt                   open close
#  <dttm>              <int> <int>
#1 1998-01-02 09:30:00   100   101
#2 1998-01-02 09:31:00   101   102
#3 1998-01-02 15:59:00   105   106
#4 1998-01-02 16:00:00   106    NA
0 голосов
/ 09 сентября 2018

Во-первых, вы должны использовать minutes (создать периоды времени) вместо minute (используется для получения минутного компонента даты-времени).Во-вторых, в add_row вы не могли ссылаться на столбцы в data со строкой или именем столбца, как в других dplyr функциях.

Один из способов сделать это:

> data <- data %>% add_row(dt = max(.$dt) + minutes(1), open = last(.$close))
> data
# A tibble: 4 x 3
  dt                   open close
  <dttm>              <int> <int>
1 1998-01-02 09:30:00   100   101
2 1998-01-02 09:31:00   101   102
3 1998-01-02 15:59:00   105   106
4 1998-01-02 16:00:00   106    NA

Где образец data:

> dput(data)
structure(list(dt = structure(c(883733400, 883733460, 883756740
), class = c("POSIXct", "POSIXt"), tzone = "UTC"), open = c(100L, 
101L, 105L), close = c(101L, 102L, 106L)), row.names = c(NA, 
-3L), class = c("tbl_df", "tbl", "data.frame"))
...