2014-02-11 2 views
1

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

Я исследовал 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) 

Есть 100 строк в NetWt.

+1

Это невозможно понять без данных примера. См. Здесь для подсказок, как помочь нам помочь вам: http://stackoverflow.com/a/5963610/1527403 –

+0

Посмотрите на 'roll =" ближайший аргумент '' в 'data.table' –

ответ

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

Большое спасибо за взяв время, чтобы дать мне этот код Рикардо. Я установил библиотеку data.table и запустил код, и я думаю, что понимаю, что он делает. Однако только вычитание для одного значения NetWt, ближайшего к значению SetPt, и всех других NetWts равно NA. Мне нужно, чтобы код проходил через каждое значение NetWt, а затем находил ближайшее значение SetPt и вычислял NetWt-SetPt для каждого NetWt, чтобы я мог построить разницу временных рядов между фактическими весами сети и преобладающей уставкой за этот период. – TrevorRi

+0

Спасибо Рикардо. Я понял, как заменить NA на последнее значение SetPt: NWSP <-transform (NetWt, SP = na.locf (SP)), и мне пришлось изменить параметр roll для roll = -Inf, чтобы выбирать только предыдущие значения, и теперь он отлично работает. – TrevorRi

0

Вот решение с использованием 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)) 
+0

Спасибо за решение Joshua. Мне удалось получить версию data.table выше, но вы научили меня по-другому в R. Спасибо за ваше время и знания. – TrevorRi

Смежные вопросы