私はdatetimeが開始日時と終了日時の間にあるかどうかを調べ、それに一致する値を返すかどうかを調べようとしています。それはdata.tableで動作しているが、DPLYRで動作させたい。あなたは日付時刻があれば2番目のテーブルの2つの日付の間に日付が返される場合
だから:
2017-07-01 02:15:00
2017-07-01 02:30:00
を第二のテーブルでこれらを調べる
begin, end, value1, value2
2017-07-01 00:01:00, 2017-07-01 01:00:00, 1, 2
2017-07-01 01:01:00, 2017-07-01 02:00:00, 3, 4
2017-07-01 02:01:00, 2017-07-01 03:00:00, 5, 6
リターン
date value1 value2
2017-07-01 02:15:00 5 6
2017-07-01 02:30:00 5 6
それは次のようになりますので、参照値の多くがあります。数百の検索日時。
これはdata.tableで動作しますが、多くのパッケージへの依存を減らすためにDPLYRを使用したいと考えています。これは私がこれまで持っているものです:私はのようなものを使用して考えていた
library(tidyverse)
library(lubridate)
library(data.table)
dates <- read_csv("date1.csv") %>%
mutate(date = as_datetime(date))
lookup <- read_csv("lookup.csv") %>%
mutate(begin = as_datetime(begin),
end = as_datetime(end))
dates <- data.table(dates)
lookup <- data.table(lookup)
setkey(lookup, begin, end)
dates[, c("begin", "end") := date]
test.df <- foverlaps(dates, lookup)[, c("date", "value1", "value2"),
with = FALSE]
:
dates <- structure(list(date = structure(c(1498867200, 1498868100, 1498869000,
1498869900, 1498870800, 1498871700, 1498872600, 1498873500, 1498874400,
1498875300, 1498876200, 1498877100, 1498878000, 1498878900, 1498879800,
1498880700, 1498881600, 1498882500), tzone = "UTC", class = c("POSIXct",
"POSIXt"))), .Names = "date", class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -18L))
をルックアップテーブル:
test <- dates %>% rowwise() %>%
mutate(value1 = ifelse(lookup$begin >= date & date <= lookup$end, lookup$value1, ""))
ここでは、ルックアップする日付です
lookup <- structure(list(begin = structure(c(1498867260, 1498870860, 1498874460,
1498878060, 1498881660, 1498885260, 1498888860, 1498892460, 1498896060
), class = c("POSIXct", "POSIXt"), tzone = "UTC"), end = structure(c(1498870800,
1498874400, 1498878000, 1498881600, 1498885200, 1498888800, 1498892400,
1498896000, 1498899600), class = c("POSIXct", "POSIXt"), tzone = "UTC"),
value1 = c(1L, 3L, 5L, 7L, 9L, 11L, 13L, 15L, 17L), value2 = c(2L,
4L, 6L, 8L, 10L, 12L, 14L, 16L, 18L)), .Names = c("begin",
"end", "value1", "value2"), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -9L))
'foverlaps'ではなく' data.table'で非等価結合を使用し、 'rowwise'演算を行うことはその代わりにはなりません。 – eddi
こんにちは、ありがとう、それはオプション2ですが、私はこれにDPLYRを使いたいと思います。私が考えていた1つのオプションは、データフレームをロングフォーマットに切り替え、それを15分ごとのdatetimeシーケンス(すべてのデータが4分の1時間であるため)に結合し、値を埋めてから別の結合を行います。これは可能ですが、私のアマチュアのコーディングでさえ混じっているようです。 –