Условное сопоставление и извлечение с использованием 2 таблиц данных - PullRequest
1 голос
/ 21 марта 2019

У меня есть 2 таблицы данных, и их значения приведены ниже:

dput(x)
structure(list(site = c("A", "B", "C"), date = c("2018-05-06 00:00:05", 
"2018-05-06 12:00:00", "2018-05-06 17:00:00")), .Names = c("site", 
"date"), row.names = c(NA, -3L), class = c("data.table", "data.frame"
), .internal.selfref = <pointer: 0x0000000002570788>)


dput(y)
structure(list(sites = c("A", "A", "B"), vol = c(30, 40, 20), 
    date = structure(c(1525611600, 1525625640, 1525564805), class = c("POSIXct", 
    "POSIXt"), tzone = ""), pn = c("sp90", "sp70", "sp98")), .Names = c("sites", 
"vol", "date", "pn"), class = c("data.table", "data.frame"), row.names = c(NA, 
-3L), .internal.selfref = <pointer: 0x0000000002570788>)

Результирующая таблица данных должна быть:

  site                date vol   pn
1:    A 2018-05-06 00:00:05  30 sp90
2:    A 2018-05-06 12:00:00  40 sp70
3:    B 2018-05-06 17:00:00  20 sp98

Мне нужно сначала проверить, соответствует ли сайт, затем проверить, что x $ date меньше, чем y $ date, потяните vol и pn в x.

Есть идеи?

Спасибо.

1 Ответ

0 голосов
/ 21 марта 2019

Вы могли бы что-то вроде этого -

library(data.table)
setDT(x)[,date:=as.POSIXct(date)]
setDT(y)[,date:=as.POSIXct(date)]

x[, c("vol", "pn","site") := # Assign the below result to new columns
    x[y, # join
      .(vol, pn,site), # get the column you need
      on = .(site = sites, # join conditions
             date < date 
      ), 
      mult = "last"]]

output-

> x
   site                date vol   pn
1:    A 2018-05-06 00:00:05  30 sp90
2:    A 2018-05-06 12:00:00  40 sp70
3:    B 2018-05-06 17:00:00  20 sp98

Edit-

Набор данных, который вы указали в вопросе -

x = structure(list(site = c("A", "B", "C"), 
                   date = c("2018-05-06 00:00:05", "2018-05-06 12:00:00", "2018-05-06 17:00:00")),
                  .Names = c("site","date"), row.names = c(NA, -3L), class = c("data.table", "data.frame"))


y= structure(list(sites = c("A", "A", "B"),
                  vol = c(30, 40, 20), 
                  date = structure(c(1525611600, 1525625640, 1525564805),
                  class = c("POSIXct", "POSIXt"), tzone = ""),
                  pn = c("sp90", "sp70", "sp98")),
                 .Names = c("sites", "vol", "date", "pn"),
                  class = c("data.table", "data.frame"),
                  row.names = c(NA,-3L))
...