#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. Я использую те же данные, которые вы предоставили, и это работает для меня.