Условное сопоставление и извлечение с участием 2 таблиц данных

#r #dplyr #plyr #tidyr

#r #dplyr #plyr #tidyr

Вопрос:

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

 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:

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

 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"]]
  

Вывод-

 > 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
  

Редактировать-

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

 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))
  

Комментарии:

1. Я пробовал, и по какой-то причине это выдает ошибку «сайты» не найдены.

2. Я использую те же данные, которые вы предоставили, и это работает для меня.