Взгляд вперед в наборе данных на n секунд - PullRequest
1 голос
/ 30 августа 2011

У меня есть набор данных, таких как следующие:

 TIME,VALUE
 09:00:00.0000000, 5.0  # observation 1
 09:00:00.0002326, 4.0  # observation 2
 ...
 09:00:30.0056464, 7.0  # observation n
 ...

Мне нужно иметь возможность найти значение тридцать из текущего наблюдения и сделать разницу.Например, для наблюдения 1 выше, я бы взял наблюдение n, и моя разница была бы 7,0 - 5,0 = 2,0.Я хочу сделать это для каждого наблюдения в исходном наборе.

Значения времени не могут быть точно разделены на тридцать секунд, поэтому я хотел бы получить наблюдение, которое ближе всего к тридцати секундам.Это может быть немного больше тридцати секунд, но не должно быть меньше.

Есть ли шаблон проектирования для этого в R или библиотека, в которой есть код, который поможет мне сделать это в «R-стиле»(вектор на основе)?

Ответы [ 3 ]

1 голос
/ 31 августа 2011

В одну строку:

> which(x-time0>=30)[1]
[1] 10

Полное объяснение:

Создайте пример данных. time0 - первый элемент в векторе x из POSIXct дат.

> set.seed(1)
> options(digits.secs=3)
> basetime <- "2011-08-30 09:00:00"
> time0 <- as.POSIXct(strptime(basetime, "%Y-%m-%d %H:%M:%S"))
> x <- time0 + sort(runif(20, 0, 60))

Вычтите time0 из каждого элемента x. Вы можете видеть, что 10-й элемент в первый раз превышает 30 с:

> x-time0
Time differences in secs
 [1]  3.707176 10.593405 12.100916 12.358474 15.930520 22.327434 22.802111
 [8] 23.046223 29.861954 34.371202 37.746843 39.647867 41.221371 43.057111
[15] 46.190485 46.646713 53.903381 54.492467 56.680516 59.514366

Следующая строка кода извлекает это. Поскольку даты отсортированы в порядке возрастания, извлеките первый элемент подмножества с помощью x-time0 > 30:

> which(x-time0>=30)[1]
[1] 10
1 голос
/ 30 августа 2011

Используйте diff с аргументом lag.

diff(your_data$TIME, lag = n)
0 голосов
/ 30 августа 2011

Вероятно, не самый эффективный способ, но он сделает работу.

# Create a sequece of time values
fooDate<-seq(as.POSIXct("2011-01-01 00:00:00",tz="GMT"),as.POSIXct("2011-01-31 00:00:00",tz="GMT"),by="hours")
# And some fictional data
fooData<-rnorm(length(fooDate))
# Put it into a dataframe
foo <-data.frame(time=fooDate,data=fooData)
#Get the start time
exampleTime<-foo$time[1]
#A time 34 days in advance
desiredTime <- exampleTime+60*60*34
#Which row is it in.
index <- which(foo$time>=desiredTime)
#and to get it.
foo[index[1],2]-foo[1,2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...