ОП запросил
рассчитать разницу, а затем в конечном итоге кумулятивную сумму разностей переменной. Расчеты [...] необходимо начинать заново, когда коэффициент чередуется взад-вперед.
blockquote>Вычисление различий
Функцию
rleid()
из пакета data.table можно использовать для выявления изменений вant
:library(data.table) setDT(test)[, diff := c(0, diff(x)), by = rleid(ant)] test
blockquote>x ant diff 1: 1.64 n 0.00 2: 2.54 n 0.90 3: 3.53 s 0.00 4: 3.82 s 0.29 5: 4.28 s 0.46 6: 4.74 s 0.46 7: 4.86 n 0.00 8: 5.11 s 0.00 9: 5.53 s 0.42 10: 5.95 n 0.00 11: 6.38 s 0.00 12: 6.73 n 0.00 13: 7.40 s 0.00 14: 8.51 s 1.11 15: 8.52 s 0.01 16: 8.57 n 0.00 17: 8.91 s 0.00 18: 9.33 n 0.00 19: 9.57 s 0.00 20: 9.83 s 0.26
Или, используя
shift()
:setDT(test)[, diff := x - shift(x, fill = x[1]), by = rleid(ant)]
Вычисление совокупных сумм напрямую
Если я правильно понимаю, вычисление Различия подразумевались только в качестве промежуточного шага к окончательному вычислению совокупных сумм, которые необходимо начинать заново, когда коэффициент чередуется взад-вперед .
Это может быть сделано непосредственно, потому что совокупная сумма разностей
x
равнаx
минус первое значениеx
для каждой серии идентичных значенийant
:setDT(test)[, cumsum := x - x[1L], by = rleid(ant)] test
blockquote>x ant diff cumsum 1: 1.64 n 0.00 0.00 2: 2.54 n 0.90 0.90 3: 3.53 s 0.00 0.00 4: 3.82 s 0.29 0.29 5: 4.28 s 0.46 0.75 6: 4.74 s 0.46 1.21 7: 4.86 n 0.00 0.00 8: 5.11 s 0.00 0.00 9: 5.53 s 0.42 0.42 10: 5.95 n 0.00 0.00 11: 6.38 s 0.00 0.00 12: 6.73 n 0.00 0.00 13: 7.40 s 0.00 0.00 14: 8.51 s 1.11 1.11 15: 8.52 s 0.01 1.12 16: 8.57 n 0.00 0.00 17: 8.91 s 0.00 0.00 18: 9.33 n 0.00 0.00 19: 9.57 s 0.00 0.00 20: 9.83 s 0.26 0.26
всегда храните данные ДАТЫ И ВРЕМЕНИ в Скоординированное Всемирное время (UTC иначе GMT)
C# DateTime обеспечивает DateTime. UtcNow и ToLocalTime (), SQL обеспечивает GETUTCDATE (). Вот функция SQL для преобразования UTC в местное время -
-- convert UTC to local time
create FUNCTION [dbo].[udfUtcToLocalTime]
(
@gmt datetime
)
RETURNS datetime
AS
BEGIN
DECLARE @dt datetime
SELECT
@dt = dateadd(millisecond,datediff(millisecond,getutcdate(), getdate()),@gmt)
RETURN @dt
END
пример:
SELECT dbo.udfUtcToLocalTime(someDateTimeField)
FROM someTable
Сохраните времена UTC в своей базе данных и локализуйте те времена каждый раз, когда Вы хотите показать их пользователю
Сохраните его как время UTC и затем формуйте вычисление часового пояса на клиентском конце в C#, используют.ToUniversalTime () на объекте DateTime получить время UTC, хранилище что на сервере и затем используют.ToLocalTime () для преобразования его назад.