Как я могу вычесть 2 кадра данных разной длины, выполнив поиск ближайшей метки времени в R?

Я использую R для извлечения данных из истории процессов с помощью SQL. У меня есть два кадра данных: один из весов нетто (NetWt) с отметками времени (100 строк), а другой - с заданными значениями веса (SetPt) с отметками времени (6 строк). Заданное значение изменяется нечасто, но новый вес мешка записывается каждые 30 секунд. Мне нужно вычесть два, чтобы получить результирующий кадр данных NetWt - SetPt для каждой метки времени в NetWt. В моем последнем наборе данных самая последняя временная метка SetPt раньше, чем первая временная метка NetWt. Мне нужна функция, которая будет проходить через каждую строку в NetWt, брать временную метку, искать ближайшую временную метку до этого времени в кадре данных SetPt, возвращать самые последние SetPt и выводить разницу (NetWt-SetPt).

Я исследовал merge, rbind, cbind и не могу найти функцию для поиска в обратном направлении самого последнего значения SetPt и объединения его с NetWt, чтобы я мог вычесть их, чтобы построить график разницы во времени. Кто-нибудь может помочь?

Данные:

SetPtLines <- "Value,DateTime
51.35,2014-02-10 08:10:49
53.30,2014-02-10 07:52:37
53.10,2014-02-10 07:52:19
51.70,2014-02-10 07:50:26
51.35,2014-02-09 19:25:21
51.40,2014-02-09 19:13:11
51.50,2014-02-09 18:24:53
51.45,2014-02-09 16:10:38
51.40,2014-02-09 15:54:42"
SetPt <- read.csv(text=SetPtLines, header=TRUE)

NetWtLines <- "DateTime,Value
2014-02-11 12:51:50,50.90735
2014-02-11 12:52:24,50.22308
2014-02-11 12:52:55,50.88604
2014-02-11 12:53:27,50.69514
2014-02-11 12:53:58,51.38968
2014-02-11 12:54:29,50.96672"
NetWt <- read.csv(text=NetWtLines, header=TRUE)

В NetWt 100 строк.


person TrevorRi    schedule 11.02.2014    source источник
comment
Это совершенно невозможно понять без примерных данных. См. здесь советы, как помочь нам помочь вам: stackoverflow.com/a/5963610/1527403   -  person Stephen Henderson    schedule 12.02.2014
comment
взгляните на аргумент roll="nearest" в data.table   -  person Ricardo Saporta    schedule 12.02.2014


Ответы (2)


data.table имеет аргумент roll, который, вероятно, был бы здесь очень полезен.

library(data.table)
NetWt <- as.data.table(NetWt)
SetPt <- as.data.table(SetPt)

## Only needed if dates are strings: 
## Ensure that your DateTime columns are actually times and not strings
NetWt[, DateTime := as.POSIXct(DateTime)]
SetPt[, DateTime := as.POSIXct(DateTime)]

## Next, set keys to the dates
setkey(NetWt, DateTime)
setkey(SetPt, DateTime)

## Join the two, use roll
NetWt[SetPt, NewValue := Value - i.Value, roll="nearest"]

## It's not clear which you want to subtract from which
SetPt[NetWt, NewValue := Value - i.Value, roll="nearest"]
person Ricardo Saporta    schedule 11.02.2014
comment
Большое спасибо, что нашли время, чтобы дать мне этот код Рикардо. Я установил библиотеку data.table и запустил код, и я думаю, что понимаю, что он делает. Однако он выполняет вычитание только для одного значения NetWt, ближайшего к значению SetPt, а все остальные значения NetWt являются NA. Мне нужно, чтобы код перебирал каждое значение NetWt, затем находил ближайшее значение SetPt и вычислял NetWt-SetPt для каждого NetWt, чтобы я мог построить график разности временных рядов между фактическим весом нетто и преобладающим заданным значением для этого периода. - person TrevorRi; 12.02.2014
comment
Спасибо Рикардо. Я выяснил, как заменить NA последним значением SetPt: NWSP‹-transform(NetWt, SP = na.locf(SP)) и мне пришлось изменить параметр roll на roll=-Inf, чтобы выбирать только более ранние значения, а теперь это прекрасно работает. - person TrevorRi; 12.02.2014

Вот решение с использованием xts. Обратите внимание, что ваш пример был бы более полезным, если бы SetPt и NetWt содержали некоторые перекрывающиеся наблюдения.

library(xts)
# convert your data to xts
xSetPt <- xts(SetPt$Value, as.POSIXct(SetPt$DateTime))
xNetWt <- xts(NetWt$Value, as.POSIXct(NetWt$DateTime))
# merge them
xm <- merge(xNetWt, xSetPt)
# fill all missing values in the SetPt column with their prior value
xm$xSetPt <- na.locf(xm$xSetPt)
# plot the difference
plot(na.omit(xm$xNetWt - xm$xSetPt))
person Joshua Ulrich    schedule 12.02.2014
comment
Спасибо за решение Джошуа. Мне удалось заставить работать версию data.table выше, но вы научили меня другому способу в R. Спасибо за ваше время и опыт. - person TrevorRi; 12.02.2014