data.table
делает это удобным. Здесь столбцы добавляются для первого и последнего значения в каждую минуту:
xt <- data.table(x)
xt[,first:=head(.SD,1), by=time %/% 60]
xt[,last:=tail(.SD,1), by=time %/% 60]
xt
## time value first last
## 1: 53 5 5 7
## 2: 55 5 5 7
## 3: 59 7 5 7
## 4: 61 9 9 11
## 5: 79 6 9 11
## 6: 118 11 9 11
## 7: 200 5 5 5
Вот один простой способ сократить это до мельчайших ведер. Измените столбец time
, чтобы он указывал начало минуты, удалите столбец value
и перейдите к unique
:
xt$time <- 60 * xt$time %/% 60
xt$value <- NULL
unique(xt)
## time first last
## 1: 0 5 7
## 2: 60 9 11
## 3: 180 5 5
Чтобы получить время и значения для первой и последней строк за каждую минуту, aggregate.data.frame
работает хорошо, но вам нужны два прохода.
Первые значения:
aggregate(cbind(time, value) ~ time %/% 60, data=x, FUN=head, 1)
## time%/%60 time value
## 1 0 53 5
## 2 1 61 9
## 3 3 200 5
Последние значения:
aggregate(cbind(time, value) ~ time %/% 60, data=x, FUN=tail, 1)
## time%/%60 time value
## 1 0 59 7
## 2 1 118 11
## 3 3 200 5
Затем они могут быть объединены в желаемый результат.
person
Matthew Lundberg
schedule
20.04.2014